.net core MassTransit故障处理配置

.net core MassTransit故障处理配置,.net-core,rabbitmq,masstransit,.net Core,Rabbitmq,Masstransit,我在应用程序中配置故障消费者时遇到问题。问题是,已使用的消息被传递到一个*\u error\u skipped队列,并且它不会完全消失 下面是一个非常简单的例子。客户端应用程序收到失败消息,该消息从test\u error队列中消失,但仍存在于test\u error\u skipped队列中 服务项目 使用系统; 使用System.Collections.Generic; 使用系统文本; 使用System.Threading.Tasks; 使用绿色管道; 使用大众运输; 使用masstTran

我在应用程序中配置故障消费者时遇到问题。问题是,已使用的消息被传递到一个
*\u error\u skipped
队列,并且它不会完全消失

下面是一个非常简单的例子。客户端应用程序收到失败消息,该消息从
test\u error
队列中消失,但仍存在于
test\u error\u skipped
队列中

服务项目

使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Threading.Tasks;
使用绿色管道;
使用大众运输;
使用masstTransit.Util;
命名空间MassTransitTest.Service
{
公共类请求模型
{
公共日期时间请求时间{get;set;}
}
MassTransitService类:IDisposable
{
专用只读IBusControl(总线控制);
公共大众运输服务()
{
_busControl=Bus.Factory.CreateUsingRabbitMq(配置=>
{
var host=configure.host(新Uri(“rabbitmq://localhost/mt_test,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
configure.ReceiveEndpoint(主机,“测试”,c=>
{
c、 UseRetry(r=>r.None());
c、 消费者();
});
});
TaskUtil.Await(_busControl.StartAsync());
控制台写入线(“总线启动”);
}
公共空间处置()
{
_总线控制?.StopAsync().Wait();
}
}
类RequestConsumer:IConsumer
{
公共任务消费(消费上下文)
{
WriteLine($”接收到消息id为{context.MessageId}的请求:{context.message.RequestTime}”);
抛出新的NotImplementedException();
}
}
}
客户项目

使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Threading.Tasks;
使用绿色管道;
使用大众运输;
使用masstTransit.Util;
使用MassTransitTest.Service;
命名空间MassTransitTest.Client
{
类质量瞬变
{
专用只读IBusControl(总线控制);
公共MassTransitClient()
{
_busControl=Bus.Factory.CreateUsingRabbitMq(配置=>
{
var host=configure.host(新Uri(“rabbitmq://localhost/mt_test,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});在此处输入代码
configure.ReceiveEndpoint(主机,“测试错误”,c=>
{
c、 消费者();
});
});
TaskUtil.Await(_busControl.StartAsync());
控制台写入线(“总线启动”);
}
公共异步任务发送()
{
Console.WriteLine(“发送请求”);
wait(wait busControl.GetSendEndpoint)(新Uri(“rabbitmq://localhost/mt_test/test)发送(新请求模型()
{
RequestTime=DateTime.Now
});
Console.WriteLine(“已发送请求”);
}
}
类别错误消费者:IConsumer
{
公共任务消费(消费上下文)
{
Console.WriteLine($“消息id为{context.message.FaultedMessageId}的请求失败。请求时间:{context.message.message.RequestTime}”);
返回Task.CompletedTask;
}
}
}

我正在使用.net core 2.1.1和MassTransit 5.1.3来回答您的问题,这有几个部分,首先:

当使用者引发异常时,MassTransit接收端点将消息移动到
\u错误
队列。不建议在
\u error
队列上创建接收端点,也不应这样做

如果您只是想观察使用者是否发生故障,则可以创建单独的接收端点(如故障队列)并注册您的
故障
使用者。MassTransit将发布一条实现
故障的消息,代理将通过接收端点将其路由到您的消费者

但是,根据上面的示例,您发送了一个请求,并希望客户端知道是否发生了故障。为此,我建议使用请求客户机,它设置消息头以将错误返回给请求发起人。它还允许发送响应。如果您不想等待响应,或等待查看故障是否发生,则上述故障观察者是您的最佳选择


您可以在中看到如何使用请求客户端。

我正在寻找一些关于如何使用MT正确使用滞留在
\u error
队列中的消息的文档。我尝试使用MT明确地瞄准这些队列,但它有意将它们移动到
\u error\u skipped
队列中。我的观点是成功地从一个没有正确处理错误的拓扑移动到一个正确处理错误的拓扑,同时优雅地处理卡住的消息。虽然您可以使用错误队列中的消息,但强烈建议不要这样做。最好使用工具将这些消息移动到另一个队列中进行重新处理(有时是原始队列,但应注意避免消息移动太多次)。此外,如果您收到的是跳过的消息,则不会使用错误队列中的消息类型。