Apache Camel JMS内存泄漏?

时间:2012-07-19 09:56:23

标签: java jms apache-camel

我是使用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清理队列或按需刷新其内容? 是否有更好的方法将Camel用于此类解决方案?

干杯!

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

我会接受Christian的建议并实际使用活动MQ而不是VM,但是,我会用direct:test替换file:// test端点,并在启动上下文后,创建一个生成器模板,用消息淹没路线:

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

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

}

如果这不会很快崩溃,那么很可能gc正在做它的工作。您可以在分析器中运行它以确保。