从历史上看, 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