Spring Boot JmsTemplate 未考虑消息中的replyTo

问题描述 投票:0回答:1

我根据以下代码调用jmsTemplate

    @Override
    public String sendAndReceive(String payload) {
        String retVal = "";
        try {
            final Message rspMessage = jmsTemplate.sendAndReceive(requestQueueName, new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
                    final TextMessage rqstMessage = session.createTextMessage(payload);
                    final Destination replyTo = session.createQueue(responseQueueName);
                    rqstMessage.setJMSReplyTo(replyTo);
                    return rqstMessage;
                }
            });
            assert(rspMessage != null);
            retVal = ((TextMessage)rspMessage).getText();
        } catch (JMSException jmsException) {
            // TODO
        }
        return retVal;
    }

不幸的是,消息中给出的replyTo目的地没有被考虑在内。相反,JmsTemplate 创建一个临时响应队列,如 JmsTemplate 代码中所示:

    @Nullable
    protected Message doSendAndReceive(Session session, Destination destination, MessageCreator messageCreator)
            throws JMSException {

        Assert.notNull(messageCreator, "MessageCreator must not be null");
        TemporaryQueue responseQueue = null;
        MessageProducer producer = null;
        MessageConsumer consumer = null;
        try {
            Message requestMessage = messageCreator.createMessage(session);
            responseQueue = session.createTemporaryQueue();
            producer = session.createProducer(destination);
            consumer = session.createConsumer(responseQueue);
            requestMessage.setJMSReplyTo(responseQueue);
            if (logger.isDebugEnabled()) {
                logger.debug("Sending created message: " + requestMessage);
            }
            doSend(producer, requestMessage);
            return receiveFromConsumer(consumer, getReceiveTimeout());
        }
        finally {
            JmsUtils.closeMessageConsumer(consumer);
            JmsUtils.closeMessageProducer(producer);
            if (responseQueue != null) {
                responseQueue.delete();
            }
        }
    }

有没有一种常见的方法可以让 sendAndReceive 接受你使用给定的replyTo队列? 或者我应该扩展 JmsTemplate 并覆盖 doSendAQndReceive 函数?

spring-boot spring-jms
1个回答
0
投票

sendAndReceive
的文档非常清晰:

发送消息并从指定目的地接收回复。 MessageCreator 回调创建给定会话的消息。 在此操作过程中会创建一个临时队列,并在消息的 JMSReplyTO 标头中进行设置。

您必须使用发送

© www.soinside.com 2019 - 2024. All rights reserved.