异步使用者RabbitMQ:如何从队列中接收序列中的消息

时间:2013-01-29 17:47:20

标签: spring-mvc rabbitmq

我在Micro CloudFoundry中部署了两个Spring MVC应用程序,一个是读取文件并在RabbitMQ中使用主题Exchange将近3325条消息发送到队列,另一个是在Asynchronous 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;
    }

我将非常感谢您的快速反应。

最诚挚的问候,

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:-1)

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

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

  

消息排序保证

     

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

     

可以使用具有该功能的AMQP方法将消息返回到队列   一个重新排队参数(basic.recover,basic.reject和basic.nack),或   由于频道关闭而持有未确认的消息。任何   这些场景导致消息在后面重新排队   RabbitMQ的队列早于2.7.0发布。来自RabbitMQ发布   2.7.0,即使存在重新排队或频道关闭,消息也始终按发布顺序保存在队列中。

     

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

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

相关问题