apache.camel
从历史上看, Apache ActiveMQ消息代理最初是在大型消息以MB为单位而不是GB的情况下创建的,就像您今天所做的那样。
下一代代理Apache ActiveMQ Artemis(或仅是Artemis)则不是这种情况,后者对大型消息的支持要好得多。
因此,到了大约时间,骆驼团队终于有时间进行此工作,以确保骆驼与Artemis以及大型邮件一起正常工作。 这项工作在本周末进行,我们提供了一个示例来证明这一点。
该示例使用以下两条小路线运行Camel:
第一种路由只是将文件路由到消息代理上名为data的队列。 第二条路线则相反,从数据队列到文件的路线。
请注意第二条路线,因为它已经打开了Camel的流缓存 。 这确保了Camel将以Camel可以将大数据流自动后台处理到临时磁盘空间以避免占用内存的方式来处理大型流有效负载。 Apache Camel中的流缓存是完全可配置的,您可以基于有效负载大小,JVM中剩余的内存等设置阈值,以触发何时后台处理到磁盘。 但是,默认设置通常就足够了。
然后,骆驼使用JMS组件与ActiveMQ Artemis代理进行集成,您可以如下设置:
这是所有标准配置(您还应该考虑设置连接池)。
该示例需要在JVM中单独运行ActiveMQ Artemis消息代理,然后使用较低的内存设置(例如128mb或256mb等)启动Camel JVM,这可以通过Maven完成:
export MAVEN_OPTS="-Xmx256m"
然后您通过Maven运行Camel
mvn camel:run
当应用程序运行时,您可以将大文件复制到target / inbox目录,然后将这些大消息流式传输到Artemis代理,然后再次返回到Camel,然后将其保存到target / outbox目录。
例如,我通过复制一个1.6gb的Docker VM文件来使它感到厌倦,而Camel将记录以下内容:
INFO Sending file disk.vmdk to ArtemisINFO Finish sending file to ArtemisINFO Received data from ArtemisINFO Finish saving data from Artemis as file
我们可以看到文件再次被保存,其正确大小为1.6gb
$ ls -lh target/outbox/total 3417600-rw-r--r-- 1 davsclaus staff 1.6G Oct 22 14:39 disk.vmdk
我将jconsole连接到正在运行的Camel JVM并监视了内存使用情况,如下图所示:
该图显示堆内存的峰值在130mb左右,而GC之后回落到50mb左右。 JVM的最大配置为256mb。
您可以找到有关示例的详细逐步说明,以及如何精确运行示例,因此可以自己尝试。 的
该示例是即将发布的Apache Camel 2.21发行版的一部分,其中对camel-jms组件进行了改进,以支持javax.jms.StreamMessage类型,并对ActiveMQ Artemis进行了特殊优化,如本示例所示。
PS:该示例可以用多种方式编写,但是我们没有创建另一个基于Spring Boot的示例,而是选择使用纯XML。 最终,骆驼不在乎,您可以随心所欲地实现和使用骆驼。
翻译自: https://www.javacodegeeks.com/2017/10/working-large-messages-using-apache-camel-activemq-artemis-improved-upcoming-camel-2-21-release.html
apache.camel