2012-01-19 3 views
0

Я тестирую NServiceBus на ASP.NET MVC3. На данный момент я могу отправить сообщение команды на бэкэнд, и обработчик сообщения прослушивает его. Но когда я пытаюсь опубликовать одно и то же сообщение, обработчик сообщений не прослушивает.Подписчик не может обработать сообщение от издателя

Проблема, которую я обнаружил, заключается в том, что сообщение не публикуется в очереди абонента. Когда я отладка и проверка NServiceBusHost консоли, это говорит

2012-01-19 22:53:35,042 [1] INFO NServiceBus.Unicast.UnicastBus [(null)] <(null 
)> - Subscribing to SampleMessage.Person1WasCreated, SampleMessage, Version=1.0. 
0.0, Culture=neutral, PublicKeyToken=null at publisher queue Test-web 

я снова и снова проверил мои настройки конфигурации в течение нескольких дней, и это кажется правильным для меня. Может кто-нибудь, пожалуйста, проверьте за мной, что мне не хватает? То, что я пытаюсь сделать, это опубликовать сообщение из Интернета, и сообщение должно обрабатываться на бэкэнд (ServiceHost2).

ASP.NET MVC3 Web.config

<configSections> 
    <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"/> 
    </configSections> 
    <MsmqTransportConfig InputQueue="Test-web" ErrorQueue="Test-web-error" NumberOfWorkerThreads="1" MaxRetries="5" /> 
    <MsmqSubscriptionStorageConfig Queue="Test-subscriptionstorage" /> 

Global.asax.cs

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 

      Global.Bus = Configure.WithWeb() 
       .Log4Net() 
       .CastleWindsorBuilder() 
       .XmlSerializer() 
       .MsmqTransport().IsTransactional(false) 
       .UnicastBus() 
       .LoadMessageHandlers() 
       .MsmqSubscriptionStorage() 
       .CreateBus() 
       .Start() 
       ; 
     } 

App.Config в ServiceHost2 Проект

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
    </configSections> 
    <MsmqSubscriptionStorageConfig Queue="Service2-AC1-subscriptionstorage" /> 
    <MsmqTransportConfig InputQueue="Service2-AC1" ErrorQueue="Service2-AC1-Error" NumberOfWorkerThreads="1" MaxRetries="5" /> 
    <UnicastBusConfig> 
    <MessageEndpointMappings> 
    <add Messages="SampleMessage" Endpoint="Test-web" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 
    <appSettings> 
    <add key="EndpointConfigurationType" value="ServiceHost2.EndpointConfig, ServiceHost2"/> 
    </appSettings> 
</configuration> 

EndpointConfig для ServiceHost2

namespace ServiceHost2 
{ 
    public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
    { 
     public void Init() 
     { 
      Configure.With() 
       .Log4Net() 
       .CastleWindsorBuilder() 
       .MsmqTransport() 
       .MsmqSubscriptionStorage() 
       .XmlSerializer() 
       .UnicastBus().LoadMessageHandlers() 
       ; 
     } 
    } 
} 

метод в контроллере, который опубликовать сообщение

public ActionResult CreatePerson(Person p) 
     { 
      var Person1WasCreated = new Person1WasCreated {Id = p.Id,Name = p.Name}; 
      Global.Bus.Publish(Person1WasCreated); 
      return View(); 
     } 

Спасибо.

+0

Я не вижу ничего явно неправильного, и ваш выход в журнал будет казаться, что вы фактически подписываетесь на мероприятие ... вы уверены, что оно не публикуется? Проверьте свою подписку, чтобы узнать, есть ли подписка? – JimmyP

+0

Я дважды проверил, и его нет. Он говорит, что я подписался на это сообщение, но нет никакой ценности в хранилище подписки «Service2-AC1-subscriptionstorage». Очень странно. FYI, im с использованием NServiceBus 2.6 – kekewong

+0

Подписчики хранятся на стороне издателя (на вашем веб-сайте). Проверьте очередь тестирования-subscrptionstorage? –

ответ

0

Я думаю, что узнал, почему. Я читал сегодня в этой статье около Why not publish NServiceBus messages from a web application?

В нем четко сказано, что сообщение не предполагается публиковать из Интернета. Как-то хранение подписки, созданное моим веб-проектом, не позволяет подписываться на него.

Итак, мое решение заключается в том, что я посылаю сообщение команды из Интернета обработчику сообщений в Service1 и публикую новое сообщение о событии для Service2. Даже сообщение о событии может подписаться на подписное хранилище Service1. Все работает отлично. Благодарю.