2012-07-19 71 views
0

我是使用Apache駱駝的新手,但是從我的各種測試中我意識到,使用JMS作爲隊列通道會造成內存泄漏,因爲在每次使用消息後使用的內存不會減少。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清理隊列或刷新其點播內容? 有沒有更好的方法來使用駱駝這樣的解決方案?

乾杯!

+2

爲什麼你有這些空anon處理​​器impls?他們似乎沒有做任何事情。我認爲你的路線可以表示爲:from(「file:// test」).to(「experimental:queue:test」);從(「實驗:隊列:試驗」),以(「流:出」); – 2012-07-19 15:30:26

+0

是的,處理器與問題無關,因此我刪除了它們的內容。也許我應該刪除它們,對不起。 – 2012-07-20 06:22:26

+0

我刪除了空的處理器。還有一個問題。你是如何診斷內存泄漏的?堆只是在增長,但是在每次GC之後又會變小,或者它保持很大,並且在一段時間後會出現內存不足異常? – 2012-07-20 07:01:56

回答

4

您目前正在使用vm協議的activemq,以便在您的流程中創建代理。你可以嘗試使用外部的activemq代理嗎?如果在這種情況下沒有內存泄漏,那麼問題在於activemq。無論如何,VM協議主要是爲了測試。

+0

你能否提供一個activemq的例子,正如你所描述的那樣?謝謝。 – 2012-07-20 06:27:21

+2

下載ActiveMQ,解壓並使用默認值啓動它。然後你可以使用:ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(「tcp:// localhost:61616」); – 2012-07-20 06:52:41

+0

ActiveMQ作爲一種外部服務很容易,謝謝。 – 2012-07-20 07:52:53

2

如果ActiveMQ組件存在內存泄漏,它會很驚訝 - 它會在很久以前被發現,因爲它是一個非常常用的組件。

我會採取Christian的建議,實際使用活動的MQ而不是VM,但是,我會用直接替換文件://測試端點:測試,並且在開始上下文之後,創建一個生成器模板和淹沒路線與消息:

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

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

} 

如果不很快崩潰,那麼很可能是GC是做它的工作。您可以在分析器中運行它以確保。

+0

一堆巨大的堆,但它沒有崩潰。 – 2012-07-20 07:43:56