我与Camel Producer有不同的问题我试图解决,但我遇到了其他问题。
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 :(得分:0)
是的,因为您使用了InOut模式。 您的路由期望对指定的回复队列的响应,该回复从未收到,因此导致默认的20秒。超时。
将Exchange模式更改为InOnly以解决您的问题。
除此之外,您发布的代码似乎没问题。 MAXIMUM_CACHE_POOL_SIZE在Camel内部使用,因此不会影响ActiveMQ端点设置。