1

我在 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;
    }

我将非常感谢您的快速回复。

此致,

4

2 回答 2

0

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

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

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

OP 只使用一个侦听器实例可能不是坏建议。

于 2020-11-17T06:34:19.477 回答
-1

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

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

消息排序保证

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

消息可以使用具有 requeue 参数(basic.recover、basic.reject 和 basic.nack)的 AMQP 方法返回到队列,或者由于通道关闭而持有未确认的消息。对于 2.7.0 之前的 RabbitMQ 版本,任何这些情况都会导致消息在队列后面重新排队。从 RabbitMQ 2.7.0 版开始,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭。

在 2.7.0 及更高版本中,如果队列有多个订阅者,单个消费者仍然可以观察到乱序的消​​息。这是由于可能重新排队消息的其他订阅者的行为造成的。从队列的角度来看,消息始终按发布顺序保存。

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

于 2013-01-29T23:14:12.837 回答