订阅者无法处理来自发布者的消息

时间:2012-01-19 22:59:44

标签: nservicebus

我在ASP.NET MVC3上测试NServiceBus。此刻,我能够向后端发送命令消息,消息处理程序正在监听它。但是当我尝试发布相同的消息时,消息处理程序没有监听。

我发现的问题是邮件未发布到订阅者的队列中。当我调试并检查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

我一次又一次地检查了我的配置设置几天,这对我来说似乎是对的。任何人都可以请检查我缺少什么?我正在尝试做的是从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()
                ;
        }

ServiceHost2项目中的App.Config

<?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>

ServiceHost2的EndpointConfig

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();
        }

感谢。

1 个答案:

答案 0 :(得分:0)

我想我发现了原因。我今天在阅读这篇关于Why not publish NServiceBus messages from a web application?

的文章

它非常清楚地表明,消息不应该从网上发布。不知何故,我的Web项目创建的订阅存储不允许任何订阅它。

所以我的解决方案是,我将命令消息从Web发送到Service1中的消息处理程序,并向Service2发布新的事件消息。甚至事件消息也能够订阅Service1的订阅存储。现在一切正常。感谢。