2

テスト環境で Rebus Servicebus コンソール アプリケーションを Windows サービスとして実行しています。サービスバスは次のように作成されます。

Bus = Configure.With(adapter)
               .Logging(l => l.Log4Net())
               .Transport(
                    t => t.UseRabbitMq(ConfigurationManager.AppSettings["RabbitMQ.Url"],
                        ConfigurationManager.AppSettings["RabbitMQ.Queue"],
                        ConfigurationManager.AppSettings["RabbitMQ.ErrorQueue"])
                        .ManageSubscriptions())
               .MessageOwnership(d => d.FromRebusConfigurationSection())
               .Sagas(s => s.Use(new RavenDbSagaPersister(sagaDocumentStore)))
               .Timeouts(t => t.Use(new RavenDbTimeoutStorage(sagaDocumentStore)))
               .CreateBus().Start();

アプリ設定は次のようになります。

<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="myFirstQueue"/>
<add key="RabbitMQ.ErrorQueue" value="myFirstQueue.error" />

ご覧のとおり、RabbitMQ @localhost と通信しています。

これまでのところ、これは魅力のように機能します。

ただし、同じサーバー上に Servicebus の別のインスタンスをセットアップする必要があり (これはテストサーバーであり、複数のブランチがあります)、いくつかの問題に遭遇しました。

2 番目のインスタンスの appsettings は次のようになります。

<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="mySecondQueue"/>
<add key="RabbitMQ.ErrorQueue" value="mySecondQueue.error" />

最初のサービスへのメッセージの送信を開始すると、2 番目のサービスによってもメッセージが受信されていることがわかります。これは、同じ RabbitMQ インスタンス @localhost を使用しているためだと思います。

私はサービスバスの専門家ではありませんが、別のキューを使用するだけでこの問題を解決できると思っていましたが、そうではありませんでした。

仮想ホストについて読んだことがありますが、それでよろしいですか?

私がしたいこと:

メッセージを service1 に送信 -> 特定のデータベースに保存

メッセージを service2 に送信 -> 別のデータベースに保存

実際に何が起こるか:

メッセージを service1 に送信 -> service1 AND service2 がメッセージを取得し、両方のデータベースに保存します。

誰かが私を正しい方向に向けてもらえますか? :)

4

2 に答える 2

1

仮想ホスト(vhost)を使用して解決できました

RabbitMQ で、bus1 と bus2 という 2 つの仮想ホストを追加し、ユーザーにそれらを使用する許可を与えました。

次に、接続文字列をこれに変更すると、魅力的に機能しました:)

<add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/>

于 2015-07-07T08:27:09.830 に答える
1

bus.Sendあなたがメッセージなのかメッセージなのか、あなたの質問からは明らかではありませんが、構成でbus.Publish呼び出しているManageSubscriptions()ので、後者だと思います...?

Rebus には、メッセージを送信する基本的な方法が 2 つありますbus.Send。特定の 1 人の受信者がメッセージを受信することを意図している場合、またはbus.Publish基本的に誰が受信するかを気にしない場合に送信できます :) (もちろん気にしますが、サブスクライバーとの関係の最後はbus.Subscribe、メッセージの種類を十分に気にかけているものです)。

あなたの場合、私にはあなたが望むように聞こえます。bus.Send(yourMessage)次に、送信者ので、タイプを にマッピングして、メッセージ タイプの所有app.config者を指定します。myFirstQueue

意味があるといいのですが:)これを機能させるために、仮想ホストやあらゆる種類のファンキーなRabbitセットアップをいじる必要はありません。追加の構成なしで簡単に実行できるはずです。

于 2015-07-07T14:27:21.423 に答える