MessageListener如何在JMS中运行?是否可以实时将消息加载到队列中?

时间:2019-01-29 03:38:49

标签: java jms

如果consumer.setMessageListener(myListener)是否可行以及它如何工作,我想实时地将JMS消息加载到队列中。

我不确定收听者的工作方式。我写了一个如下的监听器。

public class JmsMessageListenerExample {
public static void main(String[] args) throws URISyntaxException, Exception {
    BrokerService broker = BrokerFactory.createBroker(new URI(
            "broker:(tcp://localhost:61616)"));
    broker.start();
    Connection connection = null;
    try {
        // Producer
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                "tcp://localhost:61616");
        connection = connectionFactory.createConnection();
        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue("customerQueue");
        String payload = "Important Task";
        Message msg = session.createTextMessage(payload);
        MessageProducer producer = session.createProducer(queue);
        System.out.println("Sending text '" + payload + "'");
        producer.send(msg);

        // Consumer
        MessageConsumer consumer = session.createConsumer(queue);
        consumer.setMessageListener(new ConsumerMessageListener("Consumer"));
        connection.start();
    } finally {
        if (connection != null) {
            connection.close();
        }
        broker.stop();
    }
}

运行JmsMessageListenerExample之后,它很快完成,并且没有收到任何消息。听众是否应该继续运行直到我停止它?

1 个答案:

答案 0 :(得分:3)

设置JMS消息侦听器时,它将在其自己的线程中异步接收消息(由JMS实现调用)。在您的情况下,您需要防止main退出并停止您的应用程序,因为在这种情况下,MessageListener将终止。

另外,当您说“将JMS消息实时加载到队列中”时,我想您的意思是“当队列收到JMS消息时,请尽快从队列中吸收它们。”如果是这种情况,那么使用JMS消息侦听器是正确的方法。