1

ESBのバックグラウンドがなく、初めてNServiceBusを使用するのに苦労しています。ブログの投稿、サンプル、ドキュメントなどを読んだ後、C#クラスライブラリがメッセージを送信しない理由がわかりません。on Bus.Send(msg)「メッセージMessages.TraceStatementに宛先が指定されていません。メッセージを送信できません。構成ファイルのUnicastBusConfigセクションをチェックして、メッセージタイプにMessageEndpointMappingが存在することを確認してください。」

しかし、最初に、私のアーキテクチャと私がやろうとしていることについて少し説明します。これは、私がそこに見たどのサンプルとも異なるためです。

私の意図は、Benが行ったようにSignalRとNServiceBusを使用することですが、2つの主な変更があります。

  1. NServiceBus.Host.exeは使用しません。Webのみで、コンソールの実装は必要ありません。
  2. メッセージは、リアルタイムのコードトレースを目的として、中間層のクラスライブラリから送信されます。つまり、Bus.Sendステートメントをコードの周りに散りばめ、それによってWebページでコード実行トレースステートメント(開発者が設定したアドホック文字列)を表示できるようにしたいのです。

NServiceBusを、私が想像していること(またはテクノロジーの誤用)すらできないほど誤解していないと仮定して、クラスライブラリからメッセージを送信する方法を理解したいと思います。現在、次のようにapp.configファイルを持つ「Managers」dllがあります。

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

    <MsmqTransportConfig InputQueue="TerminalQueue" ErrorQueue="TerminalErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/>

    <UnicastBusConfig>
        <MessageEndpointMappings>
            <add Messages="Messages" Endpoint="WorkerQueue" />
        </MessageEndpointMappings>
    </UnicastBusConfig>
</configuration>

注:Benのプロジェクトでは、「Commands」の名前を「Messages」に変更しました。したがって(私の投稿の上部にあるエラーメッセージを参照してください)、私が知る限り、MessageEndpointMappingを適切に定義しました。(キューがMSMQに存在することを確認しました。)

誰かが私が間違っていることを教えてもらえますか?

また、NServiceBus.Host.exeの依存関係を削除する方法についての情報をいただければ幸いです(BenのサンプルのWorkerプロジェクトを参照してください)。理想的には、クラスライブラリがメッセージを送信し(ターミナルがBenのプロジェクトで行ったように)、Webアプリはサブスクライバーとしてイベントを処理し、SignalRを使用してメッセージを表示できます。

アップデート

現在、Web.configでカバーできると思うので、クラスライブラリプロジェクトの構成DLLを破棄しました。したがって、私のWeb.configは次のようになります。

<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<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" />

<MsmqTransportConfig
      InputQueue="WebQueue"
      ErrorQueue="WebErrorQueue"
      NumberOfWorkerThreads="1"
      MaxRetries="5"
/>

<UnicastBusConfig>
    <MessageEndpointMappings>
        <add Messages="MessageEvents" Endpoint="WebQueue" />
    </MessageEndpointMappings>
</UnicastBusConfig>

また、 http: //docs.particular.net/nservicebus/messaging/publish-subscribe/に従って、「NServiceBus_Subscriptions」と呼ばれるプライベートtramsactionalキューを作成しました。

私のGlobal.asax.csにはこれがあります:

Bus = Configure
    .WithWeb()
        .DefaultBuilder()
        .XmlSerializer()
        .MsmqTransport()
        .PurgeOnStartup(false)
        .UnicastBus()
        .LoadMessageHandlers()
            .MsmqSubscriptionStorage()
        .CreateBus()
        .Start();
4

2 に答える 2

1

メッセージをローカルに送信することが意図されている場合は、構成が間違っています。そのはず:

<MsmqTransportConfig InputQueue="WebAppQueue" ErrorQueue="TerminalErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/>

<UnicastBusConfig>
    <MessageEndpointMappings>
        <add Messages="Messages" Endpoint="WebAppQueue" />
    </MessageEndpointMappings>
</UnicastBusConfig>

MessageEndpointMappingsただし、ローカルで送信する場合は を追加する必要はありません。これを行うために呼び出すことができますBus.SendLocal。イベントを ( 経由でBus.Publish) パブリッシュおよびサブスクライブしている場合は、マッピングが必要です。

最近、1 つのホストですべてを実行するを公開しました。唯一の違いは、汎用ホストを使用しないことです。そのため、 http://docs.particular.net/samples/web/asp-mvc-application/を参照してください。

于 2011-10-13T00:20:51.417 に答える
1

これは興味深い演習のようです。その有用性はおそらく少し疑問です。結局のところ、MSMQ メッセージは特定の順序で到着するとは限らないため、受信したメッセージに基づいてクラス ライブラリで何が起こっているかを確認することは困難です。検査されているクラス ライブラリと診断 Web ページがすべて同じ Web アプリケーションにあることを正しく読んでいますか? その場合、単純な .NET イベント/デリゲートを使用してトレースを実行し、SignalR を使用してそれらを Web ページに配信する方がはるかに簡単です。

しかし、私が言ったように、それは興味深い演習なので...

ベンの答えが示すように、Web アプリケーションがそれ自体にメッセージを送信するための構成は、MsmqTransportConfig InputQueue (メッセージを受信するバスの「ホーム ベース」) を UnicastBusConfig MessageEndpointMappings エンドポイント キュー (そのタイプのメッセージを送信する場所) に一致させることです。 、またはそのタイプのメッセージをサブスクライブします。)

その他の欠落している詳細は、Web アプリケーションでバスをホストするために使用している流暢な構成である可能性があります。Hosting NServiceBus in your own Process に.LoadMessageHandlers()示されているように、構成に行が含まれていることを確認する必要があります。Web 上の多くの例では、メッセージを処理しない送信専用のエンドポイントであるため、これが省略されています。

別のオプションは、Bus.SendLocal()メソッドを使用することです。これは通常、エンドポイントがメッセージ バンドルを個別のメッセージに分割して、それぞれが独自のトランザクションを持つことができるようにするためのものですが、この演習では、メッセージ エンドポイント マッピングの要件を取り除くために使用できます。 .

于 2011-10-13T15:09:53.920 に答える