我对Rebus的实施存在一个奇怪的问题,该问题在过去的两年中一直没有出现任何问题,并且我试图找出问题的范围以及将故障排除在何处。一点背景:
因此,我们遇到的情况似乎是随机的,其中消息失败,最终出现在错误队列中,并出现Rebus错误,表明无法将消息分派给任何处理程序。这种情况可能会发生一次,但是当下一次遇到相同的消息类型时,它将得到正确处理。
以下是相关代码的片段:
public class ProcessManagerService
{
public ProcessManagerService()
{
...
BusAdapter = new BuiltinHandlerActivator();
BusAdapter.Handle<FileEventMessage>(async msg => await StartProcess(msg));
BusAdapter.Handle<ProcessRequest>(async msg => await StartProcess(msg));
Bus = Configure.With(BusAdapter)
.Logging(l => l.ColoredConsole(LogLevel.Error))
.Transport(t => t.UseMsmq(ConfigurationManager.AppSettings["Queue"]))
.Start();
}
...
public async Task StartProcess(FileEventMessage msg)
{
var svc = new StepManager() { FileEvent = msg.FileEvent };
await svc.Run();
}
public async Task StartProcess(ProcessRequest msg)
{
var svc = new StepManager();
await svc.Run(msg);
}
}
这是引发异常的示例:
5个未处理的异常:12/18/2018 7:53:00 AM -06:00: Rebus.Exceptions.RebusApplicationException:带有ID的消息 c72a8b6d-e31c-4a88-937e-612bf1db8b11和类型 ClearStone.Messages.Monitoring.File.FileEventMessage, 无法将ClearStone.Messages调度到以下位置的任何处理程序 Rebus.Pipeline.Receive.DispatchIncomingMessageStep.d__1.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在Rebus.Sagas.LoadSagaDataStep.d__7.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Rebus.Pipeline.Receive.ActivateHandlersStep.d__3.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Rebus.Pipeline.Receive.DeserializeIncomingMessageStep.d__2.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Rebus.Pipeline.Receive.HandleDeferredMessagesStep.d__12.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Rebus.Retry.Simple.SimpleRetryStrategyStep.d__8.MoveNext()
更新:这是在Rebus源中进行接线后的更详细的堆栈跟踪:
5个未处理的异常:12/20/2018 9:39:05 AM -06:00:Rebus.Exceptions.RebusApplicationException:ID为84c3605a-41de-4300-9596-97e7288d2bcb且类型为ClearStone.Messages.Monitoring.File的消息.FileEventMessage,ClearStone.Messages无法调度到任何处理程序 在C:\ Temp \ rebus_0_99_66_archive \ Rebus \ Pipeline \ Receive \ DispatchIncomingMessageStep.cs:第61行的Rebus.Pipeline.Receive.DispatchIncomingMessageStep.d__1.MoveNext() ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在C:\ Temp \ rebus_0_99_66_archive \ Rebus \ Sagas \ LoadSagaDataStep.cs:line 77的Rebus.Sagas.LoadSagaDataStep.d__7.MoveNext()中 ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在C:\ Temp \ rebus_0_99_66_archive \ Rebus \ Pipeline \ Receive \ ActivateHandlersStep.cs:line 48中的Rebus.Pipeline.Receive.ActivateHandlersStep.d__3.MoveNext()中 ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在C:\ Temp \ rebus_0_99_66_archive \ Rebus \ Pipeline \ Receive \ DeserializeIncomingMessageStep.cs:line 36中的Rebus.Pipeline.Receive.DeserializeIncomingMessageStep.d__2.MoveNext() ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在C:\ Temp \ rebus_0_99_66_archive \ Rebus \ Pipeline \ Receive \ HandleDeferredMessagesStep.cs:第114行的Rebus.Pipeline.Receive.HandleDeferredMessagesStep.d__12.MoveNext()中 ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在C:\ Temp \ rebus_0_99_66_archive \ Rebus \ Retry \ Simple \ SimpleRetryStrategyStep.cs:第105行的Rebus.Retry.Simple.SimpleRetryStrategyStep.d__8.MoveNext()中
假设很明显,并且在特定的服务器实例/环境中确实存在这种情况,我试图弄清楚为什么Rebus会以这种方式运行,而我的环境中可能会导致这种情况。关于从哪里开始寻找任何方向将不胜感激!
答案 0 :(得分:2)
听起来很奇怪:)人们遇到这个问题时,几乎总是因为他们以某种方式设置了多个Rebus实例来消耗同一队列中的消息。
在少数情况下,这是因为在将.Start()
处理程序添加到容器/内置处理程序激活器之前,在总线上 调用了add_action( 'woocommerce_admin_order_preview_end', 'custom_display_order_data_in_admin' );
function custom_display_order_data_in_admin( $order ){
//$order is empty here
}
,但这似乎不是您遇到的问题。
您能告诉我更多有关您的设置的信息吗?如果它和上面显示的一样简单,也许您可以在单独的应用程序中重现它?