我有一种情况,即在接收端接收的消息顺序有时不按顺序。
我的情况:
机器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收到的最后一条消息。
请问这里可能是什么问题。
答案 0 :(得分:0)
确保您正在使用消息确认。更多信息,请点击https://www.rabbitmq.com/confirms.html
答案 1 :(得分:0)
能否请您提供一些示例程序链接,以正确的方式实现作用域操作。或示例代码也足够
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;
}