0

我是使用 Apache camel 的新手,但从我的各种测试中,我意识到使用 JMS 作为队列通道会造成内存泄漏,因为在每条消息消耗后使用的内存并没有减少。

一个简单的例子可以更好地描述它:

public static void main(String args[]) throws Exception {
    CamelContext context = new DefaultCamelContext();
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
    context.addComponent("experimental", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file://test").to("experimental:queue:test");
        }
    });
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("experimental:queue:test").to("stream:out");
        }
    });
    Main main = new Main();
    main.getCamelContexts().add(context);
    main.run();
}

有什么方法可以强制 GC 清理队列或按需刷新其内容?有没有更好的方法来使用骆驼来解决这些问题?

干杯!

4

2 回答 2

4

您当前正在使用带有 vm 协议的 activemq,因此它会在您的进程中创建一个代理。您可以尝试使用外部 activemq 代理吗?如果在这种情况下没有内存泄漏,那么问题出在 activemq 中。无论如何,vm协议主要用于测试。

于 2012-07-19T15:29:48.520 回答
2

如果 ActiveMQ 组件有内存泄漏,我会感到惊讶——它会在很久以前就被发现,因为它是一个非常常用的组件。

我会接受 Christian 的建议,实际上使用活动 MQ 而不是 VM,而且,我会将 file://test 端点替换为 direct:test 之类的东西,然后在启动上下文后,创建一个生产者模板并淹没路由带有消息:

ProducerTemplate template = context.createProducerTemplate();
long msgNumber = 1;
while (true) {

   template.sendBody("direct:test", "message number " + msgNumber);
   msgNumber++;

}

如果这不会很快崩溃,那么 gc 很可能正在完成它的工作。您可以在探查器中运行它来确定。

于 2012-07-19T18:48:15.097 回答