【发布时间】: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 在问题中添加了代码和配置。