如何将RabbitMQ数据返回给客户端(网站用户)

时间:2019-05-07 14:45:00

标签: java rest rabbitmq spring-rabbitmq

我正在研究RabbitMQ,我想知道如何将其处理的数据返回给客户端(网站用户)。

我正在考虑的过程包括一个REST端点,用户在其中请求要处理的东西,大约需要5秒钟才能完成。因此,用户请求该请求,Web服务将该请求转发到RabbitMQ队列,该队列将在Docker容器中最多容纳10个使用方,以监听该请求并准备处理该请求。到目前为止,我可以做到这一点。问题是,消费者处理完数据后如何将数据返回给用户? 考虑到下面的设计,下面的图像可以更好地理解:

换句话说,它将是这样的:

1-生产者(其余)接收请求并将消息发送到RabbitMQ。

2-RabbitMQ将消息转发给任何正在收听的消费者。

3-消费者处理数据。

4-这是我迷路的地方。如何将生成的数据返回给客户端(网站用户)?还有一件事,用户将等待请求结束,而无需稍后发送。

为了更好的细节,我使用Java,其余部分是spring boot。

图片: enter image description here

1 个答案:

答案 0 :(得分:1)

请参见Request Reply Messaging

使用RabbitTemplate的{​​{1}}方法之一。

在消费者方面,只需从您的sendAndReceive()方法返回结果即可。

@RabbitListener

编辑

@RabbitListener(queues = "foo")
public String process(String in) {
    return in.toUpperCase();
}

您可以使用Java序列化(和默认的@SpringBootApplication public class So56025184Application { public static void main(String[] args) { SpringApplication.run(So56025184Application.class, args); } @Bean public ApplicationRunner runner(RabbitTemplate template) { return args -> { Scanner scanner = new Scanner(System.in); String toSend = scanner.nextLine(); while (!"quit".equals(toSend)) { System.out.println(template.convertSendAndReceive("q1", toSend)); toSend = scanner.nextLine(); } scanner.close(); }; } @RabbitListener(queues = "q1") public String listen(String in) { return in.toUpperCase(); } @Bean public Queue queue() { // RabbitAdmin will add this to the broker return new Queue("q1"); } } 或使用SimpleMessageConverter转换为JSON来发送/接收丰富对象(而不是简单的字符串)。