随机邮件未在Rebus中处理

时间:2018-12-18 21:24:34

标签: c# msmq rebus

我对Rebus的实施存在一个奇怪的问题,该问题在过去的两年中一直没有出现任何问题,并且我试图找出问题的范围以及将故障排除在何处。一点背景:

  • 我们一直在运行0.99.66版
  • 上周移至版本3.1.5,然后看到了问题
  • 回滚到0.99.66,问题仍然存在
  • 使用MSMQ进行运输
  • 运行Windows Server 2016
  • 在其他服务器实例上运行的相同代码没有问题

因此,我们遇到的情况似乎是随机的,其中消息失败,最终出现在错误队列中,并出现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会以这种方式运行,而我的环境中可能会导致这种情况。关于从哪里开始寻找任何方向将不胜感激!

1 个答案:

答案 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 } ,但这似乎不是您遇到的问题。

您能告诉我更多有关您的设置的信息吗?如果它和上面显示的一样简单,也许您可​​以在单独的应用程序中重现它?