0

我有一个场景,接收端收到的消息顺序有时不按顺序排列。

我的场景:

机器A:

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

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

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

机器 B:

  • 这是收货机。这台机器有一个监听器。它接收机器 A 发送的所有消息。一旦它收到“发送完成”,很明显这是来自机器 A 的最后一条消息,机器 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>
    

    机器编码

    public void sendMessage(String messageToSend,String machineBID) { Message sendMessage = new Message(messageToSend, new MessageProperties()); RabbitTemplate rabbitTemplate = messingApplContext.getBean(RabbitTemplate.class); rabbitTemplate.send(message, machineBID + ".command"); }

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

请问我可以知道这里可能是什么问题。

4

2 回答 2

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

他们都将在同一个频道上进行。return 不必是布尔值,它可以是任何你想要的,甚至是null.

this.template.invoke(t -> {
    ...
    t.send(...)
    ...
    t.send(...)
    ...
    return null;
}
于 2018-08-30T13:55:18.537 回答
0

确保您正在使用消息确认。更多信息在这里https://www.rabbitmq.com/confirms.html

于 2018-08-21T10:58:39.823 回答