2010-07-27 2 views
2

이벤트 당 두 번 이상 호출되는 핸들러와 관련된 신비한 문제가 인터페이스 상속을 통해 작성된 이벤트와 상관 관계가있는 것 같습니다.NServiceBus : 이벤트, 다중 상속, 이벤트 당 두 번 이상 호출되는 핸들러

우리는 메시지에 인터페이스 만 사용하고 NServiceBus.MessageInterfaces.MessageMapper.Reflection.MessageMapper().CreateInstance()을 사용하여 버스에 넣을 인스턴스를 만듭니다.

우리의 인터페이스 :

IOperationOccured는 - 매우 일반적인 방법으로 일에이 사건 행위에 대한 기본 동작 정보, 가입자를 포함합니다. 이 이벤트는 절대로 직접 제기되지 않습니다.

ISpecificOperationOccured - 상속 IOperationOccured. 보다 구체적인 정보가 들어 있습니다. 이 이벤트의 구독자는 이벤트가보다 구체적이기 때문에 더 구체적인 작업을 수행 할 수 있습니다.

ISpecificOperationOccured이 발생하면 IOperationOccured의 처리기가 호출되고 ISpecificOperationOccured의 처리기가 호출 된 다음 메시지가 다시 처리되어 처리기를 다시 호출하는 것으로 나타납니다.

내가 뭘 잘못 알고 있니? 나는 IOperationOccured에 대한 핸들러가 이벤트 당 한 번 호출되고 ISpecificOperationOccured에 대한 핸들러는 이벤트 당 번으로 번 호출되기를 기대합니다.

+0

당신은 단지 대신 인터페이스의 인스턴스를 Bus.CreateInstance ()를 할 수 있습니다. –

+0

비슷한 계층 구조로 테스트 솔루션에서 이것을 재현 할 수 없었습니다. 핸들러가 설정되는 방법과 구체적인 메시지 구현을 보여줄 수 있습니까? –

+0

@Udi Dahan : MessageMapper 사용보다 실질적인 차이가 있습니까? 실제로 MessageMapper에 몇 가지 유효성 검사 코드를 포함 시켰습니다 ... – brendanjerwin

답변

2

늦게 답변하지만 잘하면이 도움이 될 것입니다.

IOperationOccured 및 ISpecificOperationOccured에 대한 별도의 처리기가 동일한 끝점에 배포 될 때 이런 일이 발생합니다. 예 :

  • Endpoint1는
  • Endpoint2 (ISpecificOperationOccured를 발생시킵니다) (처리 IOperationOccured 및 ISpecificOperationOccured 모두)
에 대한 항목이 포함됩니다

Endpoint1.Subscriptions :

  • IOperationOccured -> Endpoint2
  • 을 ISpecificOperationOccured -> 종점 2

ISpecificOperationOccured가 게시되면 Endpoint2로 두 번 전송됩니다. 권장되는 접근 방식은 서로 다른 메시지 유형을 처리하기위한 별도의 끝점을 갖는 것입니다. 예 :

  • Endpoint1 (시킵니다 ISpecificOperationOccured)
  • Endpoint2
  • Endpoint3 (IOperationOccured를 처리) (처리 ISpecificOperationOccured)
+0

권장 접근법에 대한 참고 자료를 제공 할 수 있습니까? – brendanjerwin

+0

이 접근 방법에 대한 설명서는 드물지만 http://www.nservicebus.com/Monitoring.aspx, http://www.nservicebus.com/Sagas.aspx –

+0

에 대한 안내는 여기를 참조하십시오.이 해결 방법은 매우 성가신 일입니다. 나에게 이것은 버그처럼 보인다. 핸들을 두 개의 끝점으로 이동하면 메시지가 처리 된 횟수가 변경되고 디자인이 잘못되었습니다. – RMD