【问题标题】:spring-RabbitMQ manually listen to queuespring-RabbitMQ 手动监听队列
【发布时间】:2018-10-27 00:49:58
【问题描述】:

我是 rabbitmq 的新手。我正在使用 spring-amqp 来实现该功能。 正如我们所知,spring 提供@RabbitListener 来在应用程序初始化时注册一个监听器到队列中。 我想设计一个功能,当我单击某个按钮时,将创建一个新的消费者并监听指定的队列。 Java base 提供了 channel.basicConsume() 方法来消费一个队列。 spring有提供这样的功能吗?

我想像这样实现:

生产者不断向扇出交换发送消息。 当一个消费者想要加入时,调用function1 -> 创建队列并绑定到exchange -> 消费消息。
当消费者想要离开时,调用function2 -> 断开连接

【问题讨论】:

    标签: rabbitmq spring-amqp


    【解决方案1】:

    有几个选项。

    1. 使用RabbitTemplate.receive()convertAndReceive() 方法之一一次获取一条消息,您可以设置receiveTimeout 以防没有消息。

    2. RabbitTemplate.execute() 带有一个回调,该回调获取一个您可以调用 basicConsume() 的频道。这是一个较低级别的选项,不会为您进行任何转换。

    3. 动态创建SimpleMessageListenerContainer(或DirectMessageListenerContainer)并根据需要启动/停止它。

    4. ...

    在所有情况下,您都可以使用RabbitAdmin 创建/绑定队列,对于除选项 1 之外的所有情况,它可能会是一个自动删除队列,当消费者被取消时将被删除。使用选项 1,您必须使用非自动删除队列并使用 RabbitAdmin 将其删除。

    我建议#3 是使用纯 Spring AMQP 最有效的方法。

    您还可以将 Spring Integration 与入站通道适配器和发布-订阅通道一起使用;这样,您只需要一个队列(每个应用程序实例),然后为每个用户订阅一个新的MessageHandler 到频道。

    【讨论】:

    • 不过,使用 Spring Integration 可能更高效。
    • 非常感谢。我曾考虑使用选项 1,但性能看起来并不好。我会看看你推荐的选项 3。
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2020-11-07
    • 2015-02-22
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多