NServiceBus订阅无效

时间:2012-01-24 22:26:29

标签: c# windows-services ninject nservicebus

我正在尝试设置一个NServiceBus PubSub示例,该示例托管在一组Windows服务中。

我已经配置了我的发布者,可以看到它调用我的总线发布方法。我还配置了一个订阅者来收听我发送的消息。然而,看起来实际的订阅过程没有正常工作,因为我看不到订阅订阅的日志消息(就像我在PubSub示例中那样)。

我只是想知道在自己托管服务时是否需要某种魔法才能使这项工作成功。

下面是我的配置

出版商

App.Config中

 <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>
  <!-- 1. In order to configure remote endpoints use the format: "queue@machine" 
       2. Input queue must be on the same machine as the process feeding off of it.
       3. Error queue can (and often should) be on a different machine.
       4. The community edition doesn't support more than one worker thread.
  -->

  <MsmqTransportConfig InputQueue="publisher.input" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
  <UnicastBusConfig>
    <MessageEndpointMappings></MessageEndpointMappings>
  </UnicastBusConfig>

总线设置:

var bus = Configure.With()
            .Log4Net()
            .NinjectBuilder()
            .XmlSerializer()
            .MsmqSubscriptionStorage()
            .MsmqTransport()
                .IsTransactional(false)
                .PurgeOnStartup(false)
            .UnicastBus()
                .ImpersonateSender(false)
            .CreateBus()
            .Start();

订户

App.Config中

<configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>
  <!-- 1. In order to configure remote endpoints use the format: "queue@machine" 
       2. Input queue must be on the same machine as the process feeding off of it.
       3. Error queue can (and often should) be on a different machine.
       4. The community edition doesn't support more than one worker thread.
  -->

  <MsmqTransportConfig
    InputQueue="subscriber.input"
    ErrorQueue="error"
    NumberOfWorkerThreads="1"
    MaxRetries="5"
  />

  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="MyEventNamespace" Endpoint="publisher.input" />
    </MessageEndpointMappings>
  </UnicastBusConfig>

总线设置:

        var bus = Configure.With()
            .Log4Net()
            .NinjectBuilder()
            .XmlSerializer()
            .MsmqSubscriptionStorage()
            .MsmqTransport()
                .IsTransactional(false)
                .PurgeOnStartup(false)
            .UnicastBus()
                .ImpersonateSender(false)
            .CreateBus()
            .Start();

我有什么遗漏或做得很愚蠢吗?

干杯

3 个答案:

答案 0 :(得分:3)

主要问题是您没有在订阅者中的.UnicastBus()之后调用.LoadMessageHandlers()。因此,它不知道您有一个配置为来自publisher.input的事件的处理程序,因此不会订阅。

另一件事,您不需要为订阅者包含.MsmqSubscriptionStorage()。

答案 1 :(得分:1)

在订阅者中,您可以调用Bus.Subscribe()并明确设置它。

答案 2 :(得分:1)

对于使用“Unobtrusive Mode”的任何人,您还应确保定义了消息约定。

在某个地方,我看到了一个将其添加到消息处理程序项目中的示例:

class MessageConventions : IWantToRunBeforeConfiguration { 
   public void Init() {
      Configure.Instance.DefiningMessagesAs(t => t.Namespace != null &&  
            t.Namespace.StartsWith("Your.Messages.Namespace.Here"));
   }
}

对我有用。

示例代码 here 包含类似内容。