【问题标题】:How to return RabbitMQ data to the client (website user)如何将 RabbitMQ 数据返回给客户端(网站用户)
【发布时间】:2019-05-08 03:17:28
【问题描述】:

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

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

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

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

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

3 - 消费者处理数据。

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

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

图片:

【问题讨论】:

  • 您的图片显示“ActiveMQ”,但描述中没有提及。这不应该说“RabbitMQ”吗?
  • 哈哈是的...这是我在考虑使用 activemq 时所做的草图...但归根结底,两者的结构是相同的。

标签: java rest rabbitmq spring-rabbit


【解决方案1】:

Request Reply Messaging

使用RabbitTemplatesendAndReceive() 方法之一。

在消费者方面,只需从您的 @RabbitListener 方法返回一个结果。

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

编辑

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

}

您可以使用 Java 序列化(以及默认的SimpleMessageConverter)发送/接收丰富的对象(而不是简单的字符串),或者使用Jackson2JsonMessageConverter 转换为 JSON。

【讨论】:

  • 嗨,加里!感谢您的答复。我将不得不对此进行进一步研究,但这似乎就是这样。你有机会再举一个例子吗?就像,从生产者(休息)的角度发送消息并从这个 RabbitListener 接收结果?我仍然无法将这些点联系起来,关于此返回将如何最终在其余部分中转发给用户。
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多