2014-04-30 1 views
2

AutoFac을 사용하여 2 명의 소비자가있는 Windows 서비스를 설정했습니다. 행복한 경로에서, 이것은 정말로 잘 작동합니다. 나는 MassTransit이 나를 위해 예외 처리 한 impresison의 밑에 있었다. 워드 프로세서 상태로 : http://docs.masstransit-project.com/en/latest/overview/errors.htmlMassTransit의 예외적 인 버블 링 소비자가 Windows 서비스를 중단 함

가장 쉬운 것은 당신의 소비자 방법 및 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, Boolean) at 에서 System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading.ThreadPoolWorkQueue.Dispatch()에서 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 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 

Q 유료 : 모든 소비자에게 try/catch을 추가하지 않으면 서비스가 중단되는 것을 막을 수있는 방법이 있습니까? AFAIK MassTransit이이 문제를 처리해야합니다 ...

답변

2

내 사례에는이 문제가있을 수 있지만 문제를 발견했다고 생각합니다 (MassTransit의 직원 덕택에).

문제는 내 소비자가 새로운 스레드를 시작한다는 것이 었습니다.

Public Sub Consume(message As IConsumeContext(Of IMessage)) Implements Consumes(Of IConsumeContext(Of IMessage)).All.Consume 
    HandleMessageAsync(message) 
End Sub 
Private Async Sub HandleMessageAsync(context As IConsumeContext(Of IMessage)) 
    Dim something = Await _controller.GetSomething(context.Message) 
    Dim response As New MessageResponse 
    response.something = something 
    context.Respond(response) 
End Sub 

이 스레드는 MassTransit을 이해할 수 없으므로 해당 스레드에서 예외를 catch 할 수 없습니다. 나를위한 해결책은 다음과 같이 변경하는 것이 었습니다.

Public Sub Consume(context As IConsumeContext(Of IMessage)) Implements Consumes(Of IConsumeContext(Of IMessage)).All.Consume 
    Dim something = _controller.GetSomething(context.Message).Result 
    Dim response As New MessageResponse 
    response.something = something 
    context.Respond(response) 
End Sub 

Consume 메서드가 종료되기 전에 예외가 발생하는지 확인하십시오. 그렇지 않으면 스스로 잡아야합니다.