spring mvC语言 异步消费者 RabbitMQ:如何按顺序从队列接收消息



我在Micro CloudFoundry中部署了两个Spring MVC应用程序,一个是读取文件并将近3325条消息发送到RabbitMQ中的队列,主题为Exchange,另一个是在异步MessageListener的帮助下使用这些消息。问题是,侦听器正在接收没有任何序列的消息。我认为一次至少有两个侦听器线程在运行。我尝试在 OnMessage() 方法中打印消息序列,如下所示。消息不是按顺序排列的,例如 12、13、12、13 的接收方式与模式的其余部分不同,此计数实际上是随消息一起接收的传递标记。

Raw Message number: 1 contains: 1340099549587,BMA150 3-axis
Raw Message number: 1 contains: 1340099549626,BMA150 3-axis
Raw Message number: 2 contains: 1340099549666,BMA150 3-axis
Raw Message number: 2 contains: 1340099549705,BMA150 3-axis
Raw Message number: 3 contains: 1340099549746,BMA150 3-axis
Raw Message number: 3 contains: 1340099549810,BMA150 3-axis
Raw Message number: 4 contains: 1340099549866,BMA150 3-axis
Raw Message number: 4 contains: 1340099549906,BMA150 3-axis
Raw Message number: 5 contains: 1340099549951,BMA150 3-axis
Raw Message number: 5 contains: 1340099549999,BMA150 3-axis
Raw Message number: 6 contains: 1340099550063,BMA150 3-axis
Raw Message number: 6 contains: 1340099550063,BMA150 3-axis 
Raw Message number: 7 contains: 1340099550112,BMA150 3-axis 
Raw Message number: 7 contains: 1340099550169,BMA150 3-axis
Raw Message number: 8 contains: 1340099550258,BMA150 3-axis
Raw Message number: 8 contains: 1340099550210,BMA150 3-axis
Raw Message number: 9 contains: 1340099550324,BMA150 3-axis
Raw Message number: 9 contains: 1340099550362,BMA150 3-axis
Raw Message number: 10 contains: 1340099550380,BMA150 3-axis
Raw Message number: 10 contains: 1340099550417,BMA150 3-axis
Raw Message number: 11 contains: 1340099550456,BMA150 3-axis
Raw Message number: 11 contains: 1340099550496,BMA150 3-axis
Raw Message number: 12 contains: 1340099550535,BMA150 3-axis
Raw Message number: 13 contains: 1340099550575,BMA150 3-axis
Raw Message number: 12 contains: 1340099550616,BMA150 3-axis
Raw Message number: 13 contains: 1340099550714,BMA150 3-axis
Raw Message number: 14 contains: 1340099550682,BMA150 3-axis
Raw Message number: 14 contains: 1340099550748,BMA150 3-axis
Raw Message number: 15 contains: 1340099550795,BMA150 3-axis
Raw Message number: 15 contains: 1340099550850,BMA150 3-axis

以下是我的 SimpleMessageListenerContainer 的代码:

    @Bean
public SimpleMessageListenerContainer listenerContainer() {
        SimpleMessageListenerContainer container = new   SimpleMessageListenerContainer();      
        container.setConnectionFactory(connectionFactory());
        container.setQueues(super.workQueue());
        container.setConcurrentConsumers(1);
        MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(new MessageHandler());
        container.setMessageListener(messageListenerAdapter);
        return container;
    }

我将非常感谢快速回复。

此致敬意

OP 似乎使用 2 个线程从 1 个队列中消耗。然后将输出记录到一个文件中。

由于 2 个线程是独立运行的,因此一个线程比另一个线程快,我们不应该感到惊讶。

谁知道底层操作系统当时在管理什么?

对于 OP 来说,只使用一个侦听器实例可能不是坏建议。

您的问题可能与多个使用者有关,我的建议是尝试以这样一种方式构建您的解决方案,即无序的消息不会给您带来问题。(尽管这可能不切实际)。

以下摘自 http://www.rabbitmq.com/semantics.html

消息排序保证

AMQP 0-9-1 核心规范的第 4.7 节解释了 保证排序的条件:在 中发布的消息 一个通道,通过一个交换和一个队列和一个 传出频道将按与接收顺序相同的顺序接收 送。RabbitMQ 自 2.7.0 版本以来提供了更强大的保证。

可以使用具有以下功能的 AMQP 方法将消息返回到队列 重新排队参数(Basic.recover、Basic.reject 和 basic.nack),或 由于在持有未确认消息时通道关闭。任何 这些方案导致邮件在 队列 RabbitMQ 低于 2.7.0 的版本。来自 RabbitMQ 版本 2.7.0,消息始终按发布顺序保留在队列中,即使存在重新排队或通道关闭的情况也是如此。

对于版本 2.7.0 及更高版本,仍然可以用于个人 如果队列有多个,则使用者无序观察消息 用户。这是由于其他订阅者的行为,他们可能 重新排队消息。从队列的角度来看,消息是 始终按发布顺序保存。

所以看起来建议是只有一个消费者。

相关内容

  • 没有找到相关文章

最新更新