从JMS中的侦听器获取收据确认

时间:2013-11-22 20:50:37

标签: java jms activemq spring-jms

我正在使用Spring JMS和ActiveMQ使用ActiveMQ主题(发布/订阅)从发件人向多个侦听器发送消息。到目前为止,所有听众都可以接收来自发件人的消息。但我想添加一个功能,当一个特定的监听器,比如listener1,获取消息时,listener1将向收件人发送收据确认。我跟踪了my old post中的评论,并在发件人中创建了TemporaryQueue,并在发件人和收件人中使用了ReplyTo,以便从收件人向发件人收到确认邮件。

我的发件人类是:

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 world");
                message.setStringProperty("content", customerStatusMessage);
                message.setIntProperty("count", 10);
                //send acknowledge request to a listener via a tempQueue
                Destination tempQueue = session.createTemporaryQueue();
                message.setJMSCorrelationID("replyMessage");
                message.setJMSReplyTo(tempQueue);
                return message;
            }
        });
    }
}

发件人为侦听器创建TemporaryQueue以发回确认消息。然后在其中一个监听器中,我有以下代码将确认消息发送回发件人:

public class CustomerStatusListener implements SessionAwareMessageListener<Message> {
    public void onMessage(Message message, Session session) {
        if (message instanceof TextMessage) {
            try {
                System.out.println("Subscriber 1 got you! The message is: "
                        + message.getStringProperty("content"));
                //create a receipt confirmation message and send it back to the sender
                Message response = session.createMessage();
                response.setJMSCorrelationID(message.getJMSCorrelationID());
                response.setBooleanProperty("Ack", true);
                TemporaryQueue tempQueue = (TemporaryQueue) message.getJMSReplyTo();
                MessageProducer producer = session.createProducer(tempQueue);
                producer.send(tempQueue, response);
            } catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        } else {
            throw new IllegalArgumentException(
                    "Message must be of type TextMessage");
        }
    }
}

但是,我发现Listener类中的以下行会引发错误:

TemporaryQueue tempQueue = (TemporaryQueue) message.getJMSReplyTo();
MessageProducer producer = session.createProducer(tempQueue);

异常错误说:

The destination temp-queue://ID:xyz-1385491-1:2:1 does not exist. 

那么这里有什么问题?我假设发件人创建的tempQueue可用于同一JMS会话中的侦听器。为什么调用tempQueue后的message.getJMSReplyTo()对象不会返回有效的TemporaryQueue

另一个问题是:如何在发件人中收到确认邮件?我应该在发件人中实现MessageListener接口以便从收听者那里收到确认吗?或者我应该只是调用receive()方法同步接收它?

感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

如果您使用的是spring-jms,为什么不使用MessageListenerAdapter作为您的听众呢? - 他将照顾回复的东西,你的听众可以是一个简单的POJO。

在任何情况下,您都不需要将其投射到Tempoarary队列;就听众而言,它只是一个目的地。

结帐MessageListenerAdapter` javadocs

此外,您需要在发送方的临时队列上创建一个使用者,以接收回复。如果发送连接关闭,临时队列将消失。

答案 1 :(得分:0)

我最终使用单独的JMS队列将来自侦听器-1的确认消息发送给发件人。由于某种原因,ActiveMQ创建的temporaryQueue在JMS会话期间不可用。