【问题标题】:How to know if a listener gets the message in JMS?如何知道侦听器是否在 JMS 中收到消息?
【发布时间】:2013-11-26 03:56:32
【问题描述】:

我正在使用 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);
            }
        }
    }
}

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

【问题讨论】:

  • 您多次提到“异步”,但您建议您需要“同步”样式的行为,即客户端发送消息但需要回复才能继续。如果您不想同步使用 JMS,那么您可以让客户端发送消息然后轮询数据库以获取回复记录。您的侦听器使用该消息,然后在完成写入回复表(可能包含侦听器编号、custName、日期等)后,客户端将继续进行下一次轮询并继续处理。
  • 感谢您的建议。刚刚更新了我的帖子以显示消息发送者和听众,以明确我想要做什么。基本上,我只想在其中一个听众收到消息时添加消息回执确认,以便发件人知道听众CustomerStatusListener 已经收到消息。有没有简单的方法可以做到这一点?

标签: java jms activemq spring-jms


【解决方案1】:

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

  1. 发件人向第一个主题发布“请求”消息。
  2. 侦听器在侦听 Message 对象时接收消息。
  3. 在处理完消息后,Listener 将 Message 对象发送到 2nd Topic。
  4. 发送者依次监听 Message 对象接收它。我添加了有关侦听器的可识别信息,以找出哪些侦听器最终收到了我的请求 Message

希望能解决你的问题。

【讨论】:

  • 谢谢。我已经通过类似的方法解决了这个问题:使用主题向所有侦听器发送消息,并使用队列将 ack 发送回发送者。
【解决方案2】:

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

【讨论】:

  • 我应该在哪里设置replyTo,在发送者还是监听者中?为什么我需要创建一个 TemporaryQueue 来回复?
  • replyTo 是消息中的标头。搜索 JMS 回复。你说你想知道哪个听众收到了消息。如果需要,您可以使用固定的回复队列,但您需要在您的消费者上使用消息选择器,这样您就只能获得您感兴趣的回复。我建议您查找一些 JMS 教程。
  • 我尝试在发件人中使用 setReplyTo,但由于临时队列对侦听器不可用,我收到了一些错误。将开始一个新的职位。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多