2011-03-14 2 views
2

NServiceBus 위에 레이어를 작성하여 다른 개발자가보다 쉽게 ​​사용할 수 있도록하려고합니다. 나는 또한 NServiceBus 가입자를 가지고 있으며이 가능 개발자의 수에 가입 할 수 있도록 할NServiceBus에서 가입 된 메시지 유형을 수동으로 처리하려면 어떻게해야합니까?

public class NServiceBusPublisher 
{ 
    private IBus _Bus { get; set; } 

    public void NServiceBusPublisher(string argInputQueue, string argErrorQueue) 
    { 
     Configure configure = NServiceBus.Configure.With().DefaultBuilder(); 
     var transport = configure.Configurer.ConfigureComponent<MsmqTransport>(ComponentCallModelEnum.Singleton); 

     transport.ConfigureProperty(t => t.InputQueue, argInputQueue); 
     transport.ConfigureProperty(t => t.ErrorQueue, argErrorQueue); 
     transport.ConfigureProperty(t => t.NumberOfWorkerThreads, 1); 
     transport.ConfigureProperty(t => t.MaxRetries, 5); 

     _Bus = 
      configure 
      .XmlSerializer() 
      .MsmqTransport() 
         .IsTransactional(true) 
         .PurgeOnStartup(false) 
        .MsmqSubscriptionStorage() 
      .UnicastBus() 
       .ImpersonateSender(false) 
      .CreateBus() 
      .Start(); 

    } 

    public void Publish(NServiceBus.IMessage argMessage) 
    { 
     _Bus.Publish(argMessage); 
    } 
} 

을 : 나는 설정 파일없이하려고 노력하고있어

작동하는 게시자를 얻을 수 있었다 한 메시지가 NServiceBus.IMessage에서 상속으로 메시지 유형 :

public class NServiceBusSubscriber  
{ 
    private IBus _Bus { get; set; } 

    public void NServiceBusSubscriber(string argInputQueue, string argOutputQueue, string argErrorQueue, string messagesAssembly) 
    { 
     Configure configure = NServiceBus.Configure.With().DefaultBuilder(); 

     var transport = configure.Configurer.ConfigureComponent<MsmqTransport>(ComponentCallModelEnum.Singleton); 
     transport.ConfigureProperty(t => t.InputQueue, argInputQueue); 
     transport.ConfigureProperty(t => t.ErrorQueue, argErrorQueue); 
     transport.ConfigureProperty(t => t.NumberOfWorkerThreads, 1); 
     transport.ConfigureProperty(t => t.MaxRetries, 5); 

     var ucb = configure.Configurer.ConfigureComponent<NServiceBus.Unicast.UnicastBus>(ComponentCallModelEnum.Singleton); 
     ucb.ConfigureProperty(u => u.MessageOwners, new Dictionary<string,string>() 
     { 
      {messagesAssembly, argOutputQueue} 
     }); 

     _Bus = 
      configure 
      .XmlSerializer() 
      .MsmqTransport() 
         .IsTransactional(true) 
         .PurgeOnStartup(false) 
        .MsmqSubscriptionStorage()      
      .UnicastBus() 
       .ImpersonateSender(false) 
      .DoNotAutoSubscribe() 
      .CreateBus() 
      .Start(); 

    } 

    public void Subscribe<T>() where T : NServiceBus.IMessage 
    { 
     _Bus.Subscribe<T>(); 
    } 
} 

문제는 내가 특정 메시지 유형에 이벤트 핸들러를 첨부 할 수있는 방법을 찾을 수 있다는 것입니다.

제발 알아낼 수 있을까요?

대단히 감사합니다.

답변

0

자동 구독을하지 않으므로 먼저 Bus.Subscribe()를 통해 메시지 유형을 구독하면됩니다. 다른 개발자는 IWantToRunAtStartUp 확장 점 (클래스의 인터페이스를 어딘가에 구현)에서이 작업을 수행 할 수 있습니다. 거기에서 각 가입자는 IHandleMessages <T> 인터페이스를 구현합니다. 이 인터페이스를 구현하면 "T"가 메시지 유형 인 메시지로 연결됩니다.

NSB가 시작되면 NSB는 로컬 bin 디렉토리를 검색하고 모든 인터페이스 구현을 찾아내어 내부적으로 연결합니다. 거기에서 그것은 그 타입의 메시지가 도착할 때 올바른 핸들러로 보내질 것입니다.

+0

IHandleMessages 클래스를 구현하지 않고 Bus.Subscribe()를 사용하지만 NServiceBus에 메시지가 수신 될 때마다 NSB가 호출 할 수있는 일종의 메서드 이름을 제공하려고합니다. 아담 감사합니다. – bahith

+0

이것은 NSB가 작동하는 방식에 반대하며, 가능하더라도이 방법을 권장하지는 않습니다. 소비자가 인터페이스를 구현하기에 충분히 간단해야하며, 사용자를 대신하여 유선 방식 인 "Handle"메소드가 포함되어 있습니다. –

+0

나는 Adam에 동의한다 - NServiceBus는 "독단적 인 틀"이다. 그러한 의견을 거스러 뜨리면 매우 어려워집니다. –

0

NServiceBus는 자동으로 메시지 구독을 처리합니다. Configure.With()를 호출하면 .... Start(); NServiceBus는 IHandleMessages (SomeMessage)를 구현하는 어셈블리를 검색하고 게시자에게 구독 요청을 보냅니다.

"DoNotAutoSubscribe"를 추가하면 처리중인 모든 메시지를 수동으로 가져와 각각에 대해 Bus.Subscribe()를 수행해야합니다.

그 외에도 NServiceBus는 수신 메시지를 적절한 처리기로 라우팅하는 것을 자동으로 처리합니다. 위의 구독자 코드에서 오류 메시지가 나타나거나 대기열에서 메시지가 사라지고 있습니까?

+0

라이브러리 사용자가 메시지 수신시 라이브러리가 호출하는 콜백 메소드를 제공하는 Bus.Subscribe()를 호출하는 메소드를 호출하려고합니다. 귀하의 질문에 대답; 오류가 발생하지 않습니다. 감사합니다. 조나단 – bahith

1

문제가 해결 된 지 오래되었으므로 문제가 해결되었는지 확신 할 수 없지만 Bus.Subscribe를 사용하여 해결할 수있는 방법 중 하나입니다 (다른 응답자의 말처럼 그것은 NServiceBus를) 일을하지 규정 된 방법

그런 다음 대리자에서 메시지를 처리 ​​할 수있는 과부하를

void Subscribe(Type messageType, Predicate<IMessage> condition); 

을 구독 사용하여 메시지 유형으로 가입

private bool Handle(NServiceBus.IMessage nsbMsg) 
    { 
     //you get the message instance that you can handle 
     //return true 
    } 

그래서, 당신의 코드는 것

class MySubscriber 
    { 
     public IBus Bus {get; set;} 

     public void Subscribe() 
     { 
     Bus.Subscribe(typeof(MyMessage), Handle); 
     }  

     public void Handle(NServiceBus.IMessage nsbMsg) 
     { 
     var msg = nsbMsg as MyMessage; 

     //your code 
     return true; 
     } 
    } 

그러나 이렇게함으로써 당신은 그렇지의 IOC 프레임 워크를 사용 NServiceBus에 의해 당신을 위해 관리했을 핸들러 자신의 수명을 관리해야하는 점에 유의하시기 바랍니다 선택.

또한 IHandleMessage 인터페이스를 구현하는 경우 자동으로 주입되는 IBus에 대한 참조를 명시 적으로 전달해야합니다.

여기서 아키텍처 포인트는 NSB가 메시징 계층이 아닌 완전한 'ESB'라는 점입니다. ESB 위에 다른 레이어를 추가하는 것은 너무 추상적 인 IMHO입니다.

관련 문제