我使用 AutoFac 设置了一个包含 2 个消费者的 Windows 服务。在一条快乐的道路上,这确实非常有效。我的印象是大众交通为我处理了例外情况。
正如文档所述:http://docs.masstransit-project.com/en/latest/overview/errors.html http://docs.masstransit-project.com/en/latest/overview/errors.html
最简单的事情就是让异常从你的程序中冒出来
Consumer方法和MassTransit会自动捕获异常
为你
当消费者抛出异常时,MassTransit 确实产生了错误,但我的服务仍然崩溃:
应用程序:WerkgeverService.exe 框架版本:v4.0.30319
描述:由于未处理的异常,进程被终止。
异常信息:AutoMapper.AutoMapperMappingException 堆栈:位于
System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__5(System.Object)
在
System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
在
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,
System.Threading.ContextCallback、System.Object、布尔值)位于
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,
System.Threading.ContextCallback、System.Object、布尔值)位于
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
在 System.Threading.ThreadPoolWorkQueue.Dispatch() 处
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
记录异常是因为我记录了所有未捕获的异常:
Protected Overrides Sub OnStart(args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
Try
Initialize()
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf HandleBubbledException
Catch ex As Exception
Me.EventLog.WriteEntry(ex.Message, EventLogEntryType.Error)
Throw
End Try
End Sub
Private Sub HandleBubbledException(sender As Object, args As UnhandledExceptionEventArgs)
Dim exception = DirectCast(args.ExceptionObject, Exception)
Me.EventLog.WriteEntry(String.Format("Message: {0} {2}Stacktrace:{2}{1}", exception.Message, exception.StackTrace, Environment.NewLine), EventLogEntryType.Error)
End Sub
异常本身是 AutoMapper 中的一个,并且确实记录在事件日志中(因此它不由 MassTransit 处理):
Message: Missing type map configuration or unsupported mapping.
Mapping types:
Int32 -> Int64
System.Int32 -> System.Int64
QUESTION: 有什么方法可以在不添加的情况下防止服务崩溃try/catch
对每一个消费者? AFAIK MassTransit 应该处理这些......