【发布时间】:2017-03-09 11:29:19
【问题描述】:
我们将 MassTransit(3.5.2) 与 RabbitMQ(3.6.6) 一起使用。我们遇到了永远不会从队列中删除的消息的问题(即使我们已经阅读并使用了该消息)。 为了从队列中读取,我们实现了一个 IConsumer 类。
我们唯一要做的就是关闭发件人(突然)。 在那之后,消息永远不会被确认,并且 rabbitmq 一直在继续向我们的消费者发送相同的消息。
有没有其他人遇到过同样的问题,你是如何解决这个问题的?
:: 从 cmets 更新 ::
我们已经检查了日志文件,它说:“关闭 AMQP 连接 ([::1]:57008 -> [::1]:5672): 客户端意外关闭了 TCP 连接”。 这并不奇怪,因为我实际上是通过杀死 .exe 文件来意外关闭 tcp 连接:)
关于来自 masstransit 的日志文件,我们也这样做了,我们没有收到任何错误,我们只收到两条调试消息。 一个是我们收到的,一个是我们正在发送结果的。 调试 47 MassTransit.Messages - RECEIVE rabbitmq://localhost/[VirtualHost]/[ConsumerName] N/A ContractCommand CommandConsumer(00:00:00.0364932) 调试 30 MassTransit.Messages - 发送 rabbitmq://localhost/[VirtualHost]/bus-[ComputerName]-[SenderName].Server.vshost-4bayyydsf9rfs3qzbdkgx8bbr1?durable=false&autodelete=true d0700000-762f-c85b -f03a-08d4679c39d4 结果
我在消费者中所做的一个观察是,在我强制关闭我的发件人的同时,我收到一个 MessageNotConfirmedException,然后是来自 RabbitMQ 的一些 AlreadyClosedException。 之后,当 MT 没有设置 ACK/NACK 时,我们就进入了无限循环。 (并且在无限循环中我没有收到任何 MessagenNotConfirmedException)。 此外,为了让我的消费者再次正常工作,我需要重新启动我的消费者,然后它将被 ACK/NACKed。
MessageNotConfirmedMessage:mscorlib.dll 中的“'MassTransit.RabbitMqTransport.MessageNotConfirmedException”附加信息:rabbitmq://localhost/[VirtualHost]/bus-[ComputerName]-[Service].Server.vshost-4bayyydsf9rfsf3ybdkgxg 5h8b => 消息未被 RabbitMQ 确认 'RabbitMQ.Client.Exceptions.AlreadyClosedException' 附加信息:已经关闭:AMQP操作被中断:AMQP关闭原因,由Peer发起,code=404,text="NOT_FOUND - no exchange 'bus-[ComputerName]-[ServiceName] ].Server.vshost-4bayyydsf9rfs3qzbdkgx8bbr1' in vhost '[VirtualHost]'", classId=60, methodId=40, cause=
【问题讨论】:
-
哪个版本的 MT?
-
消费者代码会有所帮助。不知道什么是(突然的)
-
我现在已经更新了问题中的版本(MT 为 3.5.2,RabbitMQ 为 3.6.6)。关于消费者代码,它只是执行验证然后返回。如果我不清楚这是我突然关闭的发件人(只是杀死.exe),并且在我关闭发件人后,消费者一次又一次地收到相同的消息。如果我以受控方式关闭发件人(不发送消息时),我不会遇到任何问题。所以只有在我发送消息的同时终止进程。
-
您应该在您的消费者服务中添加一个日志库,并将日志级别设置为调试,然后看看它会产生什么结果。因为会在某个地方记录一个错误来解释该问题。我猜它无法创建 _error 队列来移动错误消息。还要检查 RabbitMQ 代理日志文件中是否存在无效/不一致的交换和/或绑定。
-
感谢您的输入 Chris,我们已经检查了日志文件并显示:“关闭 AMQP 连接 ([::1]:57008 -> [::1]: 5672): 客户端意外关闭 TCP 连接”。这并不奇怪,因为我实际上是通过杀死 .exe 文件来意外关闭 tcp 连接:)
标签: c# rabbitmq masstransit