我对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上
任何帮助将不胜感激。 预先感谢。
答案 0 :(得分:0)
我自己通过调试代码找到了解决方案。 我忘记在netty4-camel端点中设置属性 sync = false ,因为我不想处理消息并在处理后将答案发送回服务器,只是消耗-而sync = true(默认设置) )缓冲所有传入的数据以供以后引起我的“内存泄漏”的响应。 从netty4-camel文档(http://camel.apache.org/netty4.html)中,“ sync”的行为尚不完全清楚-我将建议对该文档进行改进(将写有建议的邮件),以使用法更加清晰
也许这可以帮助另一个遇到类似问题的人。
最佳