2012-03-13 3 views
1

우리는 NServiceBus를 사용하여 한 시스템의 데이터 변경에 관한 메시지를 우리 환경의 다른 시스템에 전파합니다.NServiceBus 치명적인 오류시 중지

클라이언트 (수신) 시스템에서 예외가 발생했을 때 대기열에서 실패한 메시지를 제거하지 않고 메시지 처리를 중단하고 문제를 조사하고 열.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

편집 : 당신은 아마 IManageMessageFailures 인터페이스를 구현하는 것이 좋습니다

 Configure.With() 
      .DefiningCommandsAs(t => typeof(ICommand).IsAssignableFrom(t)) 
      .DefiningEventsAs(t => typeof(IEvent).IsAssignableFrom(t)) 
      .DefiningMessagesAs(t => typeof(IMessage).IsAssignableFrom(t)) 
      .Log4Net<NlogAppenderForLog4Net>(a => { }) 
      .NinjectBuilder(Kernel) 
      .XmlSerializer() 
      .MsmqTransport() 
       .DefineEndpointName("consumer.input") 
       .IsTransactional(true) 
       .PurgeOnStartup(false) 
      .MsmqSubscriptionStorage("consumer") 
      .UnicastBus() 
       .LoadMessageHandlers() 
       .ImpersonateSender(false) 
      .CreateBus().Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install()); 
+0

어떻게 호스팅하고 있습니까? –

+0

@JoachimIsaksson Windows 서비스에서 내 NServiceBus 구성에 ive가 추가되었습니다 –

+0

사가에서 상태를 변경 한 다음 모든 후속 메시지를 시간 초과 서비스로 푸시하면 사가에서이 작업을 수행 할 수 있습니다. 큰 어쩌면? 그것은 나를 괴롭히는 '대기열의 같은 장소'입니다. 정기적 인 처리 과정에서 모든 메시지가 일관된 순서로 수신되고 처리되는 것이 확실합니까? –

답변

2

Heres는 내 현재 설정. 이것이 실패하면

public interface IManageMessageFailures 
{ 
    void SerializationFailedForMessage(TransportMessage message, Exception e); 
    void ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e); 
} 

, 그것은 당신이 취할 조치로 구성에서 지정한대로 호출이 인터페이스를 사용하면 예외 메시지에 액세스 할 수 있습니다. 이는 DefineCriticalErrorAction(Action onCriticalError)을 통해 이루어집니다. 기본값은 작업자 스레드 수를 0으로 설정하여 프로세스를 스핀 다운 할 수있게하는 것입니다. 당신은 당신의 결함 매니저에서 그렇게 할 수 있습니다. 전송 레이어를 탭하여 스레드를 다시 추가 할 수 있어야합니다.