2011-10-12 1 views
1

ESB 배경없이 NServiceBus를 처음 사용하는 데 어려움을 겪고 있습니다. 블로그 게시물, 샘플, 문서 등을 읽은 후 C# 클래스 라이브러리가 메시지를 보내지 않는 이유를 알 수 없습니다. Message.TraceStatement. 메시지를 보낼 수 없습니다. 구성 파일의 UnicastBusConfig 섹션을 확인하고 MessageEndpointMapping이 메시지 유형에 있는지 확인하십시오. "코드 추적 메커니즘으로 NServiceBus : 클래스 라이브러리에서 메시지 보내기 및 SignalR을 사용하여 웹 응용 프로그램에 표시

하지만 처음에는 내가 본 어떤 샘플과도 다르므로 먼저 내 아키텍처와 내가하려는 일에 대해 약간 설명합니다.

내 의도는 SignalR 및 NServiceBus like Ben did을 사용하는 것입니다,하지만 두 가지 주요 변화 :

  1. NServiceBus.Host.exe 없음 사용. 나는 웹 전용, 콘솔 구현이 필요 없다.
  2. 메시지는 실시간 코드 추적을 위해 중간 계층 클래스 라이브러리에서 전송됩니다. 즉, 내 코드 주위에 Bus.Send 문을 뿌리므로 웹 페이지에서 코드 실행 추적 문 (개발자가 설정 한 임시 문자열)을 볼 수 있습니다.

내가 그런 제가 구상하는 것도 가능 아니라고 학위 (또는 기술의 오용)에 NServiceBus을 오해하지 않은 가정하면, 나는 클래스 라이브러리에서 메시지를 보내는 방법을 파악하고 싶습니다. 현재 내가 다음과 같이 app.config 파일이있는 "관리자"DLL을 가지고 :

<configuration> 
    <configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    </configSections> 

    <MsmqTransportConfig InputQueue="TerminalQueue" ErrorQueue="TerminalErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/> 

    <UnicastBusConfig> 
     <MessageEndpointMappings> 
      <add Messages="Messages" Endpoint="WorkerQueue" /> 
     </MessageEndpointMappings> 
    </UnicastBusConfig> 
</configuration> 

참고 : 벤의 프로젝트에서 나는 "메시지"를 "명령"을 이름. 따라서 (내 게시물의 상단에있는 오류 메시지를 참조하여) MessageEndpointMapping을 올바르게 정의했다고 말할 수 있습니다. (대기열이 MSMQ에 있는지 확인했습니다.)

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까?

또한 NServiceBus.Host.exe 종속성을 제거하는 방법에 대한 의견을 많이 듣습니다 (Ben의 샘플에서 Worker 프로젝트 참조). 이상적으로 클래스 라이브러리는 (터미널이 Ben의 프로젝트에서했던 것처럼) 메시지를 보내고, 웹 애플리케이션은 가입자로서 이벤트를 처리하고 SignalR을 사용하여 메시지를 표시 할 수 있습니다. 내가의 Web.config가 그것을 커버 것이라고 생각하기 때문

업데이트는 현재 전 클래스 라이브러리 프로젝트의 구성 DLL을 도랑을했다. 그래서 내의 Web.config 이제 다음있다 같습니다

<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
<section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 

<MsmqTransportConfig 
     InputQueue="WebQueue" 
     ErrorQueue="WebErrorQueue" 
     NumberOfWorkerThreads="1" 
     MaxRetries="5" 
/> 

<UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="MessageEvents" Endpoint="WebQueue" /> 
    </MessageEndpointMappings> 
</UnicastBusConfig> 

는 또한 http://docs.particular.net/nservicebus/messaging/publish-subscribe/에 따라 "NServiceBus_Subscriptions"라는 개인 tramsactional 큐를 만들었습니다. 당신의 의도가 구성이 잘못 로컬 다음 메시지를 보낼 경우

Bus = Configure 
    .WithWeb() 
     .DefaultBuilder() 
     .XmlSerializer() 
     .MsmqTransport() 
     .PurgeOnStartup(false) 
     .UnicastBus() 
     .LoadMessageHandlers() 
      .MsmqSubscriptionStorage() 
     .CreateBus() 
     .Start(); 

답변

1

:

내 Global.asax.cs이 있습니다. 그것은해야한다 :

<MsmqTransportConfig InputQueue="WebAppQueue" ErrorQueue="TerminalErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/> 

<UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="Messages" Endpoint="WebAppQueue" /> 
    </MessageEndpointMappings> 
</UnicastBusConfig> 

그러나 로컬로 보내기위한 MessageEndpointMappings를 추가 할 필요가 없다. 이 작업을 수행하려면 Bus.SendLocal으로 전화하십시오.이벤트를 게시하고 구독하는 경우 (Bus.Publish 통해) 매핑이 필요합니다.

저는 최근에 example을 발행하여 하나의 호스트에서 처리합니다. 유일한 차이점은 일반적인 호스트를 사용하지 않으므로 문의해야합니다. http://docs.particular.net/samples/web/asp-mvc-application/

+0

답변 해 주셔서 감사합니다. SendLocal() 시도 할 때 null 참조 예외가 발생합니다. 내 IMessage 개체가 아닙니다. NetscapeBus.Configure.With() '뒤에'MsmqSubscriptionStorage() '또는'DbSubscriptionStorage() '를 추가하십시오. "라는 메시지가 나타나면 Publish()를 시도하면"이 끝점에서 게시 할 수 없습니다. 그러나 .MsmqSubscriptionStorage()를 Global.asax.cs에서 내 .WithWeb() 호출로 연결하면 오류가 해결되지 않습니다. – Patrick

1

이것은 흥미로운 운동처럼 보입니다. 어쩌면 약간의 의문이있을 수도 있습니다. 결국 MSMQ 메시지는 특정 순서로 도착하지 않을 수 있으므로 수신 된 메시지를 기반으로 클래스 라이브러리에서 어떤 일이 일어나는지 확실히 알 수 없습니다. 검사중인 클래스 라이브러리와 진단 웹 페이지가 모두 동일한 웹 응용 프로그램에 있다는 것을 정확히 읽었습니까? 그렇다면 간단한 .NET 이벤트/위임자를 사용하여 추적을 수행 한 다음 SignalR을 사용하여 웹 페이지로 전달하는 것이 훨씬 더 간단합니다. 내가 말했듯이

는하지만, 그것은 벤의 응답에서 볼 수 있듯이

가 자신에게 메시지를 보낼 수있는 웹 응용 프로그램의 구성이 MsmqTransportConfig InputQueue을하는 것입니다 ... 재미있는 운동이기 때문에 (버스의 "홈 base ")가 UnicastBusConfig MessageEndpointMappings Endpoint 대기열과 일치합니다 (해당 유형의 메시지를 보내거나 해당 유형의 메시지를 구독하는 곳).

다른 누락 된 세부 정보는 사용자가 유창한 구성 일 수 있습니다 귀하의 웹 응용 프로그램에서 버스를 호스팅하는 데 사용합니다. Hosting NServiceBus in your own Process과 같이 구성에 .LoadMessageHandlers() 행이 포함되어 있는지 확인해야합니다. 웹에서의 많은 예는 메시지를 처리하지 않는 송신 전용 엔드 포인트이기 때문에 이것을 생략합니다.

또 다른 옵션은 일반적으로 엔드 포인트가 메시지 번들을 개별 메시지로 분리하여 각자 고유의 트랜잭션을 가질 수 있지만이 연습에서 요구 사항을 제거하는 데 도움이되는 Bus.SendLocal() 메소드를 사용하는 것입니다 메시지 엔드 포인트 맵핑의 경우.

+0

메시지 순서가 좋습니다. 정적 카운터 또는 UI에서 올바르게 정렬 할 수있는 다른 고유 한 순차적 ID를 사용할 것입니다. 나는 모든 것을 시도해 왔지만이 일을하는 데 여전히 운이 없다. 현재 구성으로 원래 질문을 업데이트합니까? – Patrick

관련 문제