【问题标题】:Need help wtih AMQP在 AMQP 方面需要帮助
【发布时间】:2014-12-18 14:59:23
【问题描述】:

我们的项目需要监听不同机器上托管的队列。例如,我们有 4 个虚拟主机。我为每个主机创建了 SimpleMessageListenerContainer 的新实例,但我使用了一个 MessageListener 实例(它实现了 ChannelAwareListener 以便我可以手动确认)。 MessageListener 是一个由 spring 管理的 bean。创建容器时,我维护主机和容器实例的映射。收到消息后,检查我是否从主机收到了所需的消息,从地图中获取容器实例(使用@Resource)并停止监听主机。还要手动确认消息并将消息存储在 cassandra 数据库中。

现在,有时有些消息没有保存在数据库中而丢失了。我认为这可能是一种竞争条件,或者是因为我只使用了一个 messagelistener 实例,但我必须这样做才能获得地图(@Resource)。对不起,如果我没有任何意义。我第一次使用 AMQP 并试图理解它。任何建议都会很棒。谢谢!

【问题讨论】:

    标签: spring-amqp


    【解决方案1】:

    为什么需要手动确认?通常最好让容器处理 acks (AUTO)。如果监听器抛出异常,它将确认成功消息并确认它。

    【讨论】:

    • 我们要处理消息然后确认,因为如果服务器宕机,我们将丢失消息。
    • 容器会为你处理这些; Spring AMQP AUTO ack 表示容器将确认正常的侦听器完成并在侦听器抛出异常时拒绝(默认情况下重新排队)(如果服务器关闭,消息也会重新排队)。这与 RabbitMQ autoAck 不同,在 Spring AMQP 中称为 NONE。很少需要使用MANUAL acks。
    猜你喜欢
    • 2011-01-27
    • 2014-02-06
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多