Java JMS ActiveMQ—关闭用于使用MessageListener创建消费者的会话 &g



我有一个使用ActiveMQ的JAVA应用程序。遵循使用特定"会话"的建议;对于每个消费者(为了避免来自不同线程的会话并发性问题),我在创建每个新消费者之前创建一个新会话。这些消费者正在使用MessageListener以异步方式收集他们的消息。

当一个消费者关闭时,我还想关闭用于创建该消费者的会话(并且显式创建),但是我没有访问用于创建我要关闭的特定消费者的会话的权限(此方法不存在于MessageConsumer"消费者的对象)。我不想让所有这些会话保持打开状态,因为消费者正在动态地连接和断开连接,最终打开(和未使用)会话的数量将非常高。

是否有访问"会话"的方法?它被用来创建一个特定的"消费者"。(MessageConsumer对象)使用MessageListener?

当使用MessageListerner的消费者关闭会话时,还有其他方法关闭会话吗?

另一种可能是自动清除"会话"吗?没有任何与之相关的资源(消费者、生产者等)?

下面是我的代码片段:

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(session.createQueue(queueName));
consumer.setMessageListener(new CustomMessageListener(locWSInstance));

您可以将会话和消费者传递给CustomerMessageListener,它可以在CustomMessageListener的关闭生命周期中调用close。否则,您将需要某种Manager/Tracker类来跟踪所有对象,以防止资源/内存泄漏。这与JDBC没有什么不同!有状态通信带来了性能和好处,但作为一种权衡,您必须跟踪您的清理工作。

  1. 使用PooledConnectionFactory

  2. 确保对生命周期逻辑进行单元测试。这是一个等待发生的资源泄漏/内存泄漏。

  3. 每个对象周围做适当的try {} catch {} finally{}逻辑,以确保在所有对象上调用close,并且您不会在.close()方法上有泄漏,抛出异常并在所有.close()被调用之前退出代码路径(见下文)

    public void deactivate() {
    if(consumer != null) {
    try {
    consumer.close();
    } catch (JMSException e) {
    // do some logging
    } finally {
    consumer = null;
    } 
    }
    if(session != null) {
    try {
    session.close();
    } catch (JMSException e) {
    // do some logging
    } finally {
    session = null;
    } 
    }
    }
    

最新更新