我是Apache Camel的新手,正在尝试将一些路线付诸实践。我有一个TCP服务器,它服务大型JSON消息(大小可达~30-50kB,我无法控制源大小),其中包含大量测量数据,我希望使用某些工作正常的附加路由来处理这些数据。我在spring-boot环境1.5.7中使用camel 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-30 of的频率提供服务),直到java抛出java.lang.OutOfMemoryError: Java heap space。
如果没有任何路由,则没有记录内存泄漏,因为我可以将问题集中在netty-route上
任何帮助都将不胜感激。提前谢谢。
发布于 2018-10-18 11:43:20
我自己通过调试代码找到了解决方案。我忘了在netty4-camel端点中设置属性sync=false,因为我不想处理消息并在处理后向服务器发回一个答案,只是消耗-而sync=true (默认设置)缓冲所有传入的数据以供稍后响应,这导致了我的“内存泄漏”。“同步”的行为在netty4-camel文档(http://camel.apache.org/netty4.html)中并不完全清楚-我将建议改进文档(将写一封带有提案的邮件),以使用法更清楚一些。
也许这对另一个有类似问题的人有帮助。
最好的
https://stackoverflow.com/questions/52853590
复制相似问题