我根据以下代码调用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 函数?
sendAndReceive
的文档非常清晰:
发送消息并从指定目的地接收回复。 MessageCreator 回调创建给定会话的消息。 在此操作过程中会创建一个临时队列,并在消息的 JMSReplyTO 标头中进行设置。
您必须使用发送