Apache Camel,Netty4端点作为客户端-内存泄漏

时间:2018-10-17 11:16:17

标签: java spring memory-leaks apache-camel netty

我对Apache Camel并不陌生,并试图将一些路线付诸实践。 我有一个TCP服务器,该服务器提供大型JSON消息(最大大小约为30-50kB,其中我对源大小没有任何控制权),其中包含很多测量数据,我想使用某些有效的附加路由进行处理精细。 我在spring-boot环境1.5.7中使用骆驼2.20。 我遇到的问题是,如果我注释掉除传入的减少的netty4路由(仅往返于计数器)以外的所有其他路由,请参见下文

@Bean
public RouteBuilder getRoute() {
    String fromSource = String.format("netty4:tcp://%s:%d?clientMode=true&textline=true&receiveBufferSize=64000&decoderMaxLineLength=64000",sourceIp,sourcePort);
    return new RouteBuilder() {
        from(fromSource)
        .to("metrics:counter:incomingCounter");


    };
}

该路由几乎可以正常工作,但是会消耗越来越多的堆空间(每秒约2MB,其中消息以大约20-30Hz的频率提供服务),直到Java抛出java.lang.OutOfMemoryError:Java堆空间。 / p>

没有任何路由,没有内存泄漏被记录,因为我可以将问题集中在netty-route上

任何帮助将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:0)

我自己通过调试代码找到了解决方案。 我忘记在netty4-camel端点中设置属性 sync = false ,因为我不想处理消息并在处理后将答案发送回服务器,只是消耗-而sync = true(默认设置) )缓冲所有传入的数据以供以后引起我的“内存泄漏”的响应。 从netty4-camel文档(http://camel.apache.org/netty4.html)中,“ sync”的行为尚不完全清楚-我将建议对该文档进行改进(将写有建议的邮件),以使用法更加清晰

也许这可以帮助另一个遇到类似问题的人。

最佳