【发布时间】:2020-04-06 17:04:34
【问题描述】:
当主题的订阅者抛出异常时,未处理的消息将进入{subscribername}_error 队列。
举个例子:
const string subsriberName = "AnotherSubscriber";
cfg.SubscriptionEndpoint<AnotherThingHappened>(host, subsriberName, configurator =>
{
configurator.Handler<AnotherThingHappened>(context =>
{
Console.WriteLine(context.Message.AnotherThingType);
if (Random.NextDouble() < 0.1)
{
throw new Exception("Oups, I failed :(");
}
return Task.CompletedTask;
});
});
它在主题 ObjectCreatedA 上创建了“AnotherSubscriber”订阅。但是当它失败时,消息会进入队列anothersubscriber_error。它使诊断、监控和重播消息变得更加困难。因为从 ASB 的角度来看,这只是一个普通的队列。
如何将故障路由到主题 ObjectCratedA/AnotherSubscriber 而不是 **_error one 的 DLQ?
提前致谢。
【问题讨论】:
-
你不能,MassTransit 不是这样工作的。
-
请问,为什么要这样设计?例如。如果我有一个监听 5 种类型事件的 WebJob,那么我需要创建 5 个具有唯一名称(如 WebJobType)的订阅端点,那么来自这些处理程序的错误将最终出现在一个非常混乱的队列中。我不能轻易地重播它们。
-
那么为每种类型创建一个唯一的订阅名称?我不知道,这就是它的工作方式。如果您有更好的建议,我会全力以赴,但我不相信您可以将消息写入订阅 DLQ。
标签: masstransit