【问题标题】:javax.jms.IllegalStateException: The Session is closedjavax.jms.IllegalStateException:会话已关闭
【发布时间】:2016-02-19 11:13:22
【问题描述】:

我尝试解决的 Camel Producer 存在不同的问题,但我陷入了其他问题。

1) 我做的第一个实现是在每次需要与 ActiveMQ 主题进行通信时创建一个生产者模板。这导致内存结果不佳,导致服务器在一段时间后崩溃。

内存问题的解决方案是在每次请求后停止()生产者模板。该修复已纠正内存问题,但会导致一些延迟问题。

2)我在某处读到不必每次都创建生产者模板。所以我决定解决延迟问题并在我的班级中只声明一个生产者模板并将其用于每个请求。它似乎工作正常,没有内存泄漏,修复延迟问题......

但是,当我们发送多个需要很长时间(每个 20 秒)的查询时,看起来我们遇到了超时并且组件崩溃了类似 «javax.jms.IllegalStateException: The会话已关闭»。

有没有办法做多线程?这是使用 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 );
}

【问题讨论】:

    标签: java apache-camel activemq apache-servicemix


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我使用 InOut 模式是因为该生产者响应 REST 查询。我认为我无法为 InOnly 更改它...
    • 生产者模板会创建一个新的 Exchange,因此您不必在到您提供的处理器的路由上更改原始 Exchange 的交换模式。您可以仅将 InOnly 用于在您的处理器中创建的交换。
    • 嗯,不太明白。如果我必须等待响应,它如何与 InOnly 模式一起使用?
    • 抱歉,我不确定我是否理解问题所在。您是否希望收到对这些消息的回复?如果是这样,那么您需要定义一个回复队列并使用 InOut 模式。
    • 是的,当我调用 sendBody 时,我正在等待响应。它工作正常。但有时,我会超时,因为处理需要 20-30 秒。你能告诉我如何在回复队列中使用 InOut 模式的示例吗?
    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 2010-11-29
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多