何时以及如何在异步消息侦听器的情况下关闭连接?

时间:2017-05-21 14:19:38

标签: jms activemq

创建连接,然后创建一个会话,然后从队列中获取一定数量的消息。

public class Consumer {
    public static void main(String[] args) throws JMSException {
        Consumer consumer = new Consumer(); // creates a connection and session

        Destination destination = consumer.getSession().createQueue("JOBS"); 
        MessageConsumer messageConsumer = consumer.getSession().createConsumer(destination);
        messageConsumer.setMessageListener(new Listener(job)); // asynchronous listener.

        consumer.close(); // closes the connection
    }
}

何时以及如何关闭连接?因为当我按上述方式执行时,只读取一条消息! 如果我没有如上所述关闭连接,则会读取所有消息,因此可以,但连接保持打开状态。

1 个答案:

答案 0 :(得分:0)

由您来决定何时关闭连接。

您可以在关闭前添加Thread.sleep或添加 shutdownHook 以在卡纸停止时关闭:

Thread shutdownHook = new Thread(new Runnable() {
        @Override
        public void run() {
           consumer.close();
        }
    });  

Runtime.getRuntime().addShutdownHook(shutdownHook);

另一种方法:

  

最大不活动持续时间(在考虑套接字之前)   死的)以毫秒为单位。在某些平台上,它可能需要很长时间才能完成   套接字似乎死了,所以我们允许代理终止连接   他们在一段时间内没有活动。一些运输使用   启用保持心跳功能。设置为值<= 0以禁用   不活动监控。

您可以使用wireFormat.maxInactivityDuration指定连接的最大不活动持续时间,为此,当您使用MQ代理创建连接时,您应该创建这样的

cf = new ActiveMQConnectionFactory(
    "tcp://localhost:61616?wireFormat=openwire&wireFormat.maxInactivityDuration=value");

阅读此ActiveMQ文档以获取更多详细信息http://activemq.apache.org/cms/configuring.html