javax.jms.IllegalStateException:会话已关闭

时间:2015-11-17 22:00:30

标签: java apache-camel activemq apache-servicemix

我与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 );
}

1 个答案:

答案 0 :(得分:0)

是的,因为您使用了InOut模式。 您的路由期望对指定的回复队列的响应,该回复从未收到,因此导致默认的20秒。超时。

将Exchange模式更改为InOnly以解决您的问题。

除此之外,您发布的代码似乎没问题。 MAXIMUM_CACHE_POOL_SIZE在Camel内部使用,因此不会影响ActiveMQ端点设置。