如何知道侦听器是否在JMS中获取消息?

时间:2013-11-18 22:13:35

标签: java jms activemq spring-jms

我正在使用Spring JMS和ActiveMQ异步地将消息从一个发件人发送到多个侦听器。所有侦听器都订阅ActiveMQ主题,以便可以将消息传递给它们。我想知道特定的侦听器是否从发件人那里获取了消息。有没有办法实现这个目标?

编辑:添加了JMS发件人和监听器类

这是我的邮件发件人类:

public class CustomerStatusSender {
    private JmsTemplate jmsTemplate;
    private Topic topic;

    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void setTopic(Topic topic) {
        this.topic = topic;
    }

    public void simpleSend(final String customerStatusMessage) {
        jmsTemplate.send(topic, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage("hello from sender.");
                message.setStringProperty("content", customerStatusMessage);
                return message;
            }
        });
    }
}

这是消息监听器之一:

public class CustomerStatusListener implements MessageListener {
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                System.out.println("Subscriber 1 got you! The message is: "
                        + message.getStringProperty("content"));
            } catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        }
    }
}

在发送者类中调用simpleSend()方法后,订阅此主题的所有侦听器都将异步获取此消息。但我想知道这个特定的CustomerStatusListener是否收到来自邮件发件人的邮件。如何异步进行?我假设我不能像其中一个答案中建议的那样在发件人和监听器中使用ReplyTo,如果我想异步进行的话。我需要在发送方和侦听器类中添加什么才能从侦听器获取消息接收确认?

2 个答案:

答案 0 :(得分:6)

之前我遇到过这样的情况。我使用了两个主题来处理场景。第一个主题用于发布,第二个主题用于收据。这是我在我的应用程序中的流程。

  1. 发件人向第一个主题发布“请求”消息。
  2. 侦听器在收听消息< Request>时收到消息。宾语。
  3. 在处理消息之后,监听器发送消息< Ack>反对第二主题。
  4. 发件人依次收听消息< Ack>对象收到它。我添加了有关监听器的可识别信息,以找出哪些监听器最终得到了我的请求消息< Request>。
  5. 我希望它能解决你的问题..

答案 1 :(得分:4)

您必须设置replyTo并在收到消息时让侦听器回复。您可以为回复创建TemporaryQueue。