2015-11-17 150 views
0

我試圖解決一個駱駝生產者有不同的問題,但我陷入了其他問題。javax.jms.IllegalStateException:會話關閉

1)我做的第一個實現是每次我們需要與一個ActiveMQ主題進行通信時創建一個生產者模板。這導致內存結果不佳,導致服務器在某段時間後崩潰。

內存問題的解決方案是在每次請求後停止()生產者模板。該修復程序糾正了內存問題,但導致了一些延遲問題。

2)我在某處讀過,沒有必要每次創建生產者模板。所以我決定解決延遲問題,並在我的課堂中只聲明一個生產者模板,並將其用於每個請求。它似乎工作正常,沒有內存泄漏,修復延遲問題...

但是,當我們發送多個查詢需要很多時間(每個20秒)時,它看起來像我們遇到了超時和組件崩潰類似於«javax.jms.IllegalStateException:會話已關閉»。

有沒有辦法做多線程?這是通過使用InOut交換模式導致的嗎? MAXIMUM_CACHE_POOL_SIZE如何工作?我的實施是正確的嗎?

我已經把我的組件的代碼示例:

public void process(Exchange exchange) throws Exception 
{   
    Message in = exchange.getIn(); 

    if (producerTemplate == null) {    
     CamelContext camelContext = exchange.getContext(); 
     //camelContext.getProperties().put(Exchange.MAXIMUM_CACHE_POOL_SIZE, "50"); 
     producerTemplate = camelContext.createProducerTemplate(); 
    } 

    ... 
    result = producerTemplate.sendBody(String.format("activemq:%s", camelContext.resolvePropertyPlaceholders("{{channel1}}")), ExchangePattern.InOut, messageToSend).toString(); 

    ... 
    finalResult = producerTemplate.sendBody(String.format("activemq:%s", camelContext.resolvePropertyPlaceholders("{{channel2}}")), ExchangePattern.InOut, result).toString(); 

    ... 
    in.setBody(finalResult); 
} 

回答

0

是的,它是因爲你用的InOut模式。 您的路由期望對指定的答覆隊列作出響應,該響應永遠不會收到,因此會導致默認的20秒。時間到。

將Exchange模式更改爲InOnly以解決您的問題。

除此之外,你的發佈代碼似乎很好。 MAXIMUM_CACHE_POOL_SIZE在Camel內部使用,因此不影響ActiveMQ端點設置。

+0

感謝您的回覆。我使用InOut模式,因爲此生產者響應REST查詢。我認爲我無法將其更改爲InOnly ... –

+0

生產者模板會創建一個新的Exchange,因此您不必將路由上的原始Exchange的交換模式更改爲您提供的處理器。您只能將InOnly用於處理器中創建的Exchange。 – johan

+0

嗯不知道明白。如果我必須等待迴應,它如何與InOnly模式一起工作? –