2

ハンドラー Web アプリケーションと 2 つの Windows アプリケーションがあります。すべて同じマシンで実行されているこれらのアプリケーション間でメッセージを発行するように nService Bus を構成しました。

問題は、web とウィンドウ app1 の間でメッセージを発行できることです。この時点で、ウィンドウ app1 はサブスクライバーとして扱われ、メッセージを適切に受信します。ここで、ウィンドウ app1 をパブリッシャーとして機能させ、ウィンドウ app2 にメッセージを送信し、次にウィンドウ 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" />

上記の Web アプリのグローバル Asax ファイル

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

    }  

Web アプリから NService バスを介してメッセージを受信するウィンドウ App1 は、ウィンドウ app2 にメッセージを送信するために NService バスを発行するパブリッシャーとして扱われるようになりましたが、機能しません。

同じの構成セクション

<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 にデータを送り返します。

ウィンドウ 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

上記は、web 構成で適切<MessageEndpointMappings>に定義し、Bus.Publish を使用する代わりに Bus.Send を使用することで、かなり前に修正されています。これにより、私にとってはうまくいきました。

于 2016-05-31T10:28:15.737 に答える