2

我们有一个处理程序 Web 应用程序和两个 Windows 应用程序。我们已经配置了 nService Bus 来发布这些应用程序之间的消息,所有这些应用程序都在同一台机器上运行。

问题是我们能够将 web 之间的消息发布到窗口 app1。此时窗口 app1 被视为订阅者并正确接收消息。现在我们希望窗口 app1 作为发布者并向窗口 app2 发送消息,然后向窗口 app2(作为订阅者)发送消息,然后再次将窗口 app2 作为发布者并向窗口 app1 发送消息。

NService Bus 的 Web 应用程序(处理程序应用程序)配置部分

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

<MsmqTransportConfig   InputQueue="IndustrialCommsEngineQueue"
ErrorQueue="IndustrialErrorQueue"   NumberOfWorkerThreads="1"   MaxRetries="5"/>
<MsmqSubscriptionStorageConfig Queue="CommsSubscriptionQueue" />

上述网络应用程序的全局 Asax 文件

protected void Application_Start(object sender, EventArgs e)
    {
        Bus = NServiceBus.Configure.WithWeb()
                                     .DefaultBuilder()
                                      .MsmqSubscriptionStorage()
                                     .XmlSerializer()
                                     .MsmqTransport()
                                         .IsTransactional(true)
                                     .UnicastBus()
                                     .MsmqSubscriptionStorage()
                                     .CreateBus()
                                     .Start();

    }  

Window App1 通过 NService 总线从 Web 应用程序接收消息现在我们希望将其视为发布者以发布 NService 总线以将消息发送到窗口 app2 但它不起作用。

相同的配置部分

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

<MsmqTransportConfig InputQueue="IndustrialBREQueue" ErrorQueue="IndustrialErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/>   
<MsmqSubscriptionStorageConfig Queue="BRESubscriptionQueue1"/>
<Logging Threshold="WARN"/>
<UnicastBusConfig>
<MessageEndpointMappings>
  <add Messages="ComEventMessage" Endpoint="IndustrialCommsEngineQueue"/>
<add Messages="AlarmEventMessage" Endpoint="IndustrialAlarmEngineQueue"/>
    </UnicastBusConfig>

在单击按钮时触发窗口 app1 中的发布代码代码如下

 IBus bus =NServiceBus.Configure.With()
            .Log4Net()
            .DefaultBuilder()
            .XmlSerializer()
            .MsmqTransport()
            .IsTransactional(false)
            .UnicastBus()
            .LoadMessageHandlers()
            .MsmqSubscriptionStorage()
            .CreateBus()
            .Start();

窗口 app2 需要从窗口 app1 接收消息,但该消息无法正常工作,我们还希望窗口 aap2 作为发布者发布 NService 总线,并在处理此过程中断的数据后将一些数据发送回窗口 app1。

Window app2 的配置部分

<configSections>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/>
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/>
<section name="Logging" type="NServiceBus.Config.Logging, NServiceBus.Core"/>
<section name="MsmqSubscriptionStorageConfig"  type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core"/>
</configSections>
<MsmqTransportConfig InputQueue="IndustrialAlarmEngineQueue"  ErrorQueue="IndustrialErrorQueue"    NumberOfWorkerThreads="1"    MaxRetries="5"/>

<UnicastBusConfig>
<MessageEndpointMappings><add Messages="BREEventMessage" Endpoint="IndustrialBREQueue"/> </MessageEndpointMappings>
</UnicastBusConfig>

在窗口 app2 中发布代码

[STAThread]
    static void Main()
    {
        IBus bus = NServiceBus.Configure.With()
                   .Log4Net()
                  .DefaultBuilder()
                  .XmlSerializer()
                  .MsmqTransport()
                  .IsTransactional(true)
                  .UnicastBus()
                  .LoadMessageHandlers()
                  .MsmqSubscriptionStorage()
                  .CreateBus()
                  .Start();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FormAlarmsEngine());
    }

早些时候,这个过程是有效的,但有些人如何停止不弄清楚我们现在缺少什么。我们所做的只是在停止 b 到 c 和 c 到 b 连接之后重新启动了放置这些应用程序的服务器。此外,我们没有得到 b 到 c 进程的消息队列。我们想要的过程是 A 到 b , b 到 c 和 c 到 b 。

提前感谢您的帮助。

4

1 回答 1

0

<MessageEndpointMappings>通过在 web 配置中定义正确并使用 Bus.Send 而不是使用 Bus.Publish,上述问题已得到修复。通过这个它对我有用。

于 2016-05-31T10:28:15.737 回答