我们的应用程序中有一个问题陈述,我们在生产者端获得空响应。
1>生产者将生成消息(REQUEST_QUEUE),它将等待响应。
Object receivedData = amqpTemplate.convertSendAndReceive("IKEY123456");
System.out.println("RESPONSE DATA: " + receivedData);
2 - ;在消费者端,它将使用消息和
Class TestConsumer {
AmqpTemplate amqpTemplate;
public void methodA(){
String msg = (String)amqpTemplate.receiveAndConvert()
process(msg);
}
public void process(String msg){
// ... process something on that message
Object resData = service.makeChanges(msg);
// I want to send 'resData" object back to the producer
amqpTemplate.convertAndSend(resData);
}
}
生产者端的响应为空。 "响应数据:null"
任何人都可以告诉我如何将回复发送给制作人以及如何获得我们发送的请求的正确回复。
答案 0 :(得分:1)
消息传递中请求/回复模式的主要技巧是correlation
。
默认情况下,RabbitTemplate
会为每个回复创建一个新的临时队列,并将其填充到replyTo
消息属性中。
您在消费者方面的主要问题是您没有从请求中向该replyTo
队列发送回复。
如果您使用SimpleMessageListenerContainer
来接收来自requestQueue
的请求,那么会更好,更直截了当。在这种情况下,您可以使用TestConsumer
作为POJO侦听器并将其包装到MessageListenerAdapter
。最后一个负责replyTo
和correlationId
:
@Bean
public SimpleMessageListenerContainer serviceListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory());
container.setQueues(requestQueue());
container.setMessageListener(new MessageListenerAdapter(new PojoListener()));
return container;
}
public class PojoListener {
public String handleMessage(String foo) {
return foo.toUpperCase();
}
}
这是最简单的关联方式。
另一种情况是固定的replyQueue
,replyListener
,当然还有correlationId
请求和回复。在生产者方面需要更多配置,但消费者部分是相同的 - SimpleMessageListenerContainer
与MessageListenerAdapter
。
您可以从Reference Manual
获取更多信息