在 MassTransit 中从 saga 发布消息时抛出消息实体异常
The messaging entity could not be found exception is thrown when publishing message from saga in MassTransit
在 MassTransit 传输设置为 Azure 服务总线的 saga 中引发消息时,会引发以下异常并在错误队列中放置一个错误:
Put token failed. status-code: 404, status-description:
The messaging entity 'sb://xxxx-prod-bus.servicebus.windows.net/Api/StateMachine-MessageEvent' could not be found.
但是,如果 saga 再次运行,消息将成功发布。查看消息试图发布到的Topic,第一次发现Topic不存在,后来好像创建了,但是Topic上的Auto Delete On Idle
属性设置为5 分钟所以在一段时间不活动后主题消失并且错误再次出现。
消息合约的声明与 MassTransit 文档 (https://masstransit-project.com/usage/sagas/automatonymous.html#publish) 完全相同,使用接口和类型来包装 saga 实例状态:
public interface ExampleMessage
{
Guid OrderId { get; }
}
private class ExampleMessageEvent :
ExampleMessage
{
public ExampleMessageEvent(Instance instance)
{
SomeProp = instance.SomeProp;
}
public string SomeProp { get; }
}
其他处理程序只订阅 ExampleMessage
的接口,所以我希望即使没有任何内容正在监听具体类型主题,发布也会继续?
避免这些问题的最佳方法是什么?我试过使用重试来查看它是否重新创建了交换,但是在重试时没有创建任何东西。
临时主题的默认设置似乎是从 here 开始的 5 分钟
.但是,我希望如果在发布消息时主题不存在,它会重新创建吗?
引发的完整异常消息是:
Put token failed. status-code: 404, status-description: The messaging entity 'sb://something-prod-bus.servicebus.windows.net/Something.Api/SomethingStateMachine-SomethingRequiredEvent' could not be found. To know more visit https://aka.ms/sbResourceMgrExceptions. TrackingId:2f9c9776-08d5-41ab-81ba-3ec9011c2a90_G49, SystemTracker:something-prod-bus.servicebus.windows.Something.Api/SomethingStateMachine-SomethingRequiredEvent, Timestamp:2019-12-13T23:13:46.
以及完整的堆栈跟踪:
Microsoft.Azure.ServiceBus.MessagingEntityNotFoundException:
at Microsoft.Azure.ServiceBus.Core.MessageSender+d__58.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.ServiceBus.RetryPolicy+d__19.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.ServiceBus.RetryPolicy+d__19.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.ServiceBus.Core.MessageSender+d__45.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at MassTransit.Azure.ServiceBus.Core.Transport.ServiceBusSendTransport+SendClientPipe1+<Send>d__5.MoveNext (MassTransit.Azure.ServiceBus.Core, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Azure.ServiceBus.Core.Transport.ServiceBusSendTransport+SendClientPipe
1+d__5.MoveNext (MassTransit.Azure.ServiceBus.Core, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at GreenPipes.Agents.PipeContextSupervisor1+<GreenPipes-IPipeContextSource<TContext>-Send>d__8.MoveNext (GreenPipes, Version=2.1.4.118, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at GreenPipes.Agents.PipeContextSupervisor
1+<GreenPipes-IPipeContextSource-Send>d__8.MoveNext (GreenPipes, Version=2.1.4.118, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at GreenPipes.Agents.PipeContextSupervisor1+<GreenPipes-IPipeContextSource<TContext>-Send>d__8.MoveNext (GreenPipes, Version=2.1.4.118, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Transports.PublishEndpoint+<Publish>d__17
1.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at MassTransit.Transports.PublishEndpoint+d__171.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Context.InMemoryOutboxConsumeContext+<ExecutePendingActions>d__10.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Pipeline.Filters.InMemoryOutboxFilter
1+d__1.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at MassTransit.Pipeline.Filters.InMemoryOutboxFilter1+<Send>d__1.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.ApplicationInsights.Pipeline.ApplicationInsightsConsumeFilter
1+d__14.MoveNext (MassTransit.ApplicationInsights, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa)
因为您使用的是实现发布接口的class,所以您需要发布为实际的消息接口。我猜你上面的例子遗漏的一件事是 ExampleMessageEvent
class 实际上是私有的(或内部的)。
当您在 saga 中发布时,将 class 转换为接口类型,这样它就不会为 class.
创建临时主题
.Publish(context => (ExampleMessage)new ExampleMessageEvent(...));
在 MassTransit 传输设置为 Azure 服务总线的 saga 中引发消息时,会引发以下异常并在错误队列中放置一个错误:
Put token failed. status-code: 404, status-description:
The messaging entity 'sb://xxxx-prod-bus.servicebus.windows.net/Api/StateMachine-MessageEvent' could not be found.
但是,如果 saga 再次运行,消息将成功发布。查看消息试图发布到的Topic,第一次发现Topic不存在,后来好像创建了,但是Topic上的Auto Delete On Idle
属性设置为5 分钟所以在一段时间不活动后主题消失并且错误再次出现。
消息合约的声明与 MassTransit 文档 (https://masstransit-project.com/usage/sagas/automatonymous.html#publish) 完全相同,使用接口和类型来包装 saga 实例状态:
public interface ExampleMessage
{
Guid OrderId { get; }
}
private class ExampleMessageEvent :
ExampleMessage
{
public ExampleMessageEvent(Instance instance)
{
SomeProp = instance.SomeProp;
}
public string SomeProp { get; }
}
其他处理程序只订阅 ExampleMessage
的接口,所以我希望即使没有任何内容正在监听具体类型主题,发布也会继续?
避免这些问题的最佳方法是什么?我试过使用重试来查看它是否重新创建了交换,但是在重试时没有创建任何东西。
临时主题的默认设置似乎是从 here 开始的 5 分钟 .但是,我希望如果在发布消息时主题不存在,它会重新创建吗?
引发的完整异常消息是:
Put token failed. status-code: 404, status-description: The messaging entity 'sb://something-prod-bus.servicebus.windows.net/Something.Api/SomethingStateMachine-SomethingRequiredEvent' could not be found. To know more visit https://aka.ms/sbResourceMgrExceptions. TrackingId:2f9c9776-08d5-41ab-81ba-3ec9011c2a90_G49, SystemTracker:something-prod-bus.servicebus.windows.Something.Api/SomethingStateMachine-SomethingRequiredEvent, Timestamp:2019-12-13T23:13:46.
以及完整的堆栈跟踪:
Microsoft.Azure.ServiceBus.MessagingEntityNotFoundException:
at Microsoft.Azure.ServiceBus.Core.MessageSender+d__58.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.ServiceBus.RetryPolicy+d__19.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.ServiceBus.RetryPolicy+d__19.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.ServiceBus.Core.MessageSender+d__45.MoveNext (Microsoft.Azure.ServiceBus, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at MassTransit.Azure.ServiceBus.Core.Transport.ServiceBusSendTransport+SendClientPipe1+<Send>d__5.MoveNext (MassTransit.Azure.ServiceBus.Core, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Azure.ServiceBus.Core.Transport.ServiceBusSendTransport+SendClientPipe
1+d__5.MoveNext (MassTransit.Azure.ServiceBus.Core, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at GreenPipes.Agents.PipeContextSupervisor1+<GreenPipes-IPipeContextSource<TContext>-Send>d__8.MoveNext (GreenPipes, Version=2.1.4.118, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at GreenPipes.Agents.PipeContextSupervisor
1+<GreenPipes-IPipeContextSource-Send>d__8.MoveNext (GreenPipes, Version=2.1.4.118, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at GreenPipes.Agents.PipeContextSupervisor1+<GreenPipes-IPipeContextSource<TContext>-Send>d__8.MoveNext (GreenPipes, Version=2.1.4.118, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Transports.PublishEndpoint+<Publish>d__17
1.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Transports.PublishEndpoint+d__171.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Context.InMemoryOutboxConsumeContext+<ExecutePendingActions>d__10.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Pipeline.Filters.InMemoryOutboxFilter
1+d__1.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.Pipeline.Filters.InMemoryOutboxFilter1+<Send>d__1.MoveNext (MassTransit, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at MassTransit.ApplicationInsights.Pipeline.ApplicationInsightsConsumeFilter
1+d__14.MoveNext (MassTransit.ApplicationInsights, Version=5.5.6.0, Culture=neutral, PublicKeyToken=b8e0e9f2f1e657fa)
因为您使用的是实现发布接口的class,所以您需要发布为实际的消息接口。我猜你上面的例子遗漏的一件事是 ExampleMessageEvent
class 实际上是私有的(或内部的)。
当您在 saga 中发布时,将 class 转换为接口类型,这样它就不会为 class.
创建临时主题.Publish(context => (ExampleMessage)new ExampleMessageEvent(...));