【问题标题】:Issue while sending messages in loop to windows rabbitmq broker向 Windows rabbitmq 代理循环发送消息时出现问题
【发布时间】:2018-10-08 07:35:06
【问题描述】:

我的设置

  • 我有一种情况,我通过 rabbitmq 从一台机器循环发送大约 15 条消息到另一台机器。

  • 发送和接收机器之间有NAT设置

  • 我将 spring rabbitmq 用于所有 rabbitmq 操作。

  • 在接收机器上,我丢失了 2 条消息有时,即使等待很长时间也没有收到。

  • 而且我没有看到队列中积累了任何消息(在发送机器和接收机器中)。

  • 而且接收机器中只有队列的监听器。

我的问题

  • 如果我循环发送消息到rabbitmq,如果它无法处理,它是否有可能拒绝某些消息? 15 条消息的总大小接近 8mb。

即使在我向 rabbitmq 发送消息后,我也没有看到任何异常。

发送机器码

@Override
    public boolean send(final Message message, final String routingKey)
            throws SinecnmsMessagingException {
        private RabbitTemplate rabbitTemplate = null;
        rabbitTemplate.send(routingKey, message);

    }

接收机器码

<rabbit:listener-container
            connection-factory="connectionFactory">
            <rabbit:listener ref="onMessageCommand"
                queue-names="TestQueue" />
        </rabbit:listener-container>
        <bean id="onMessageCommand"
            class="com.test.OnMessageListner">
            <property name="callBackObject" ref="callbackEvent" />
            <property name="template" ref="amqpTemplate" />
        </bean>

        <bean id="callbackEvent" class="com.test.SettingsListener"></bean>

OnMessageListner 实现 MessageListener。

在 SettingsListener 类中,我收到消息。在我开发的其他代码中,这对我所有人来说都很好。只有在我提到的这个用例中,我才观察到这个问题。

【问题讨论】:

  • 您能指出您的配置中使用的交换类型吗?如果类型不是扇出,则意外的路由键将是您描述的问题的明显原因。
  • 所有消息都在同一个队列中。路由键不应该是问题,因为其他消息正常。以及它的主题交换。这个问题是间歇性的。并非总是如此。
  • 在标准设置中,主题交换意味着如果某些消息中提供的路由键与交换和队列之间的绑定不匹配,则简单地丢弃该消息。所以我坚持我的评论,这可能是问题的一个明显原因。检查您的代码以确保您始终在消息中放置相同的路由键。
  • 您应该始终显示代码和配置。您可以启用发布者确认并返回以查看消息发布的结果 - 请参阅the documentation
  • @GaryRussell 在问题中添加了代码和配置。

标签: rabbitmq spring-rabbit


【解决方案1】:

这是否意味着发布者确认引入了概念,因为有时 rabbitmq 可能会“拒绝/不接受”消息。通过发布者确认,我们可以知道rabbitmq代理是否收到了第一条消息,然后发送第二条消息。

我们可以总结一下吗?

不,你不能;等待每次确认都会减慢发布速度;确认被设计成你发送一堆消息然后等待确认。

不是&gt;introduced because sometimes rabbitmq may "reject/not accept" messages;使用 RabbitMQ 发布是异步的;所以发布通常是成功的 - 但是在发送消息和它到达代理之间可能会发生任何事情 - 如果连接丢失,客户端会被告知,但是对于发布者来说已经太晚了,因为他已经成功完成了。

NAT 应该没有什么区别,但问题可能是一些不稳定的网络路由器。

您可以使用网络监视器(例如 WireShark)来查看正在发生的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多