任何人都可以猜出问题出在哪里,因为我对如何解决这个问题一无所知。 RabbitMQ生成 _skipped 队列,但我不知道为什么生成这些队列。它是在执行发布请求响应时生成的。
Request Client是使用MassTransit.RequestClientExtensions
中的以下方法创建的public static IRequestClient<TRequest, TResponse> CreatePublishRequestClient<TRequest, TResponse>(this IBus bus, TimeSpan timeout, TimeSpan? ttl = null, Action<SendContext<TRequest>> callback = null) where TRequest : class where TResponse : class
{
return (IRequestClient<TRequest, TResponse>) new PublishRequestClient<TRequest, TResponse>(bus, timeout, ttl, callback);
}
请求如下:
TResponse response = TaskUtil.Await(() => requestClient.Request(request));
如您所见,这是“请求响应”方案,其中请求已发送给所有使用者。但是因为目前我们只有一个消费者,所以只将其发送给该消费者。如果对多个使用者进行了publishrequest-response,则死信很容易出现,一旦一个使用者响应,另一个使用者就不知道在哪里响应,并且产生了死信。但是因为这里只有一个消费者,所以我们可以消除这种可能性。
那么这些跳过的队列还有其他原因吗?非常感谢您提供有关如何解决此问题的帮助...
我必须说,在某种情况下,使用Consume方法时,我们引发RequestTimeoutException
并将其捕获到请求的应用程序中。经过测试,不会产生跳过的队列。
答案 0 :(得分:1)
跳过的队列是一个死信队列。这意味着您的终结点队列具有对某些消息交换的绑定,但是不再有该消息的使用者。也许您更改拓扑并移动了使用者。您可以转到RMQ管理UI并检查绑定以进行端点交换。如果您查看最终跳过的队列中的邮件,则会发现要查找的邮件类型。
交易所是根据消息类型命名的,因此很容易找到过时的绑定。
然后,在管理UI中,您可以手动删除已过时的绑定,并且不再有消息进入跳过的队列。