侦听器未按顺序接收RabbitMQ消息

时间:2018-08-21 10:51:34

标签: rabbitmq spring-rabbitmq

我有一种情况,即在接收端接收的消息顺序有时不按顺序。

我的情况:

机器A:

  • 我正在通过RabbitMQ铲从机器A向机器B发送一系列消息(大约12条消息)。

  • 消息的大小不同。 12条消息的总大小接近8mb。

  • 一旦发送了12条消息,我也将最后向机器B发送“完整消息”。

机器B:

  • 这是接收机。本机只有一个侦听器。它接收到MACHINE A发送的所有消息。一旦收到“发送完成”,很明显这是来自MACHINE A的最后一条消息,并且MACHINE B开始处理所有收到的消息。

    机器B配置

                                                                

        <rabbit:listener-container
            connection-factory="connectionFactory">
            <rabbit:listener ref="onMessageCommand"
                queue-names="CommandQueue" />
        </rabbit:listener-container>
        <bean id="onMessageCommand"
            class="com.mypackage.command.messaging.OnMessageListner">
            <property name="callBackObject" ref="callbackDisEvent" />
            <property name="template" ref="amqpTemplate" />
        </bean>
    
        <bean id="callbackDisEvent" class="com.mypackage.command.OperationSettingsListener"></bean>
    

    机器代码

    公共无效sendMessage(String messageToSend,String machineBID) {     消息sendMessage = new Message(messageToSend,new MessageProperties());     RabbitTemplate rabbitTemplate =     messagesApplContext.getBean(RabbitTemplate.class);     rabbitTemplate.send(消息,machineBID +“ .command”); }

问题: 有时我观察到机器B在进行某些设置之前接收到一个“发送完成”。理想情况下,“发送完成”应始终是机器B收到的最后一条消息。

请问这里可能是什么问题。

2 个答案:

答案 0 :(得分:0)

确保您正在使用消息确认。更多信息,请点击https://www.rabbitmq.com/confirms.html

答案 1 :(得分:0)

  

能否请您提供一些示例程序链接,以正确的方式实现作用域操作。或示例代码也足够

link I provided you的示例:

Collection<?> messages = getMessagesToSend();
Boolean result = this.template.invoke(t -> {
    messages.forEach(m -> t.convertAndSend(ROUTE, m));
    t.waitForConfirmsOrDie(10_000);
    return true;
});

您只需要确保所有发送都在invoke调用的范围内完成...

Boolean result = this.template.invoke(t -> {
    ...
    t.send(...)
    ...
    t.send(...)
    ...
    return true;
}

它们都将在同一频道上。返回值不必是布尔值,它可以是任何您想要的值,甚至是null

this.template.invoke(t -> {
    ...
    t.send(...)
    ...
    t.send(...)
    ...
    return null;
}