繁体   English   中英

Apache Camel JMS内存泄漏?

[英]Apache Camel JMS memory leak?

我是使用Apache骆驼的新手,但是根据我的各种测试,我意识到将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按需清理队列或刷新其内容? 是否有更好的方法将骆驼用于此类解决方案?

干杯!

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

如果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很有可能在做它。 确保可以在探查器中运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM