我試圖解決一個駱駝生產者有不同的問題,但我陷入了其他問題。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);
}
感謝您的回覆。我使用InOut模式,因爲此生產者響應REST查詢。我認爲我無法將其更改爲InOnly ... –
生產者模板會創建一個新的Exchange,因此您不必將路由上的原始Exchange的交換模式更改爲您提供的處理器。您只能將InOnly用於處理器中創建的Exchange。 – johan
嗯不知道明白。如果我必須等待迴應,它如何與InOnly模式一起工作? –