如何使用Spring AMQP将消费者对生产者的响应发送到特定请求?

时间:2014-07-16 05:32:43

标签: spring-amqp

我们的应用程序中有一个问题陈述,我们在生产者端获得空响应。

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"

任何人都可以告诉我如何将回复发送给制作人以及如何获得我们发送的请求的正确回复。

1 个答案:

答案 0 :(得分:1)

消息传递中请求/回复模式的主要技巧是correlation

默认情况下,RabbitTemplate会为每个回复创建一个新的临时队列,并将其填充到replyTo消息属性中。

您在消费者方面的主要问题是您没有从请求中向该replyTo队列发送回复。

如果您使用SimpleMessageListenerContainer来接收来自requestQueue的请求,那么会更好,更直截了当。在这种情况下,您可以使用TestConsumer作为POJO侦听器并将其包装到MessageListenerAdapter。最后一个负责replyTocorrelationId

@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();
    }
}

这是最简单的关联方式。

另一种情况是固定的replyQueuereplyListener,当然还有correlationId请求和回复。在生产者方面需要更多配置,但消费者部分是相同的 - SimpleMessageListenerContainerMessageListenerAdapter

您可以从Reference Manual

获取更多信息