4

なんらかの理由で、masstransit googleグループに投稿できません。参加したのに、このグループに投稿する権限がないと言われました。だからここに投稿します...

今私の問題のために:

私はMassTransitv2.7.2とAutoFacv2.6.3を使用しています。アセンブリをスキャンしてコンシューマーを登録するようにAutofacを構成しようとしています。IConsumerインターフェースを実装するすべてのタイプ。これはうまくいくようです。

バスを構成するときに、MassTransit.AutofacIntegrationアセンブリとLoadFrom(...)拡張メソッドを使用して、コンテナーからのコンシューマーをMassTransitに登録しています。コードは次のとおりです。

var builder = new ContainerBuilder();
builder
      .RegisterAssemblyTypes(typeof (CreateElectionCommandHandler).Assembly)
      .Where(type => type.Implements<IConsumer>())
      .AsSelf();
var container = builder.Build();

var localBus = ServiceBusFactory.New(configurator =>
                                         {
                                             //configurator.ReceiveFrom("loopback://localhost/testqueue");
                                             configurator.ReceiveFrom("rabbitmq://localhost/commandqueue");
                                             configurator.UseRabbitMq();
                                             configurator.Subscribe(sbc => sbc.LoadFrom(container));
                                         });

Assert.IsTrue(container.IsRegistered<CreateElectionCommandHandler>());
Assert.IsTrue(container.IsRegistered<TerminateElectionCommandHandler>());
Assert.AreEqual(1, localBus.HasSubscription<CreateElection>().Count());
Assert.AreEqual(1, localBus.HasSubscription<TerminateElection>().Count());

ループバックを使用して上記のコードを実行した場合

configurator.ReceiveFrom("loopback://localhost/testqueue");

構成(rabbitmq conifigをコメントアウト)、テストは合格します。

「ループバック」設定をコメントアウトして、

 configurator.ReceiveFrom("rabbitmq://localhost/commandqueue");
 configurator.UseRabbitMq();

構成、テストは失敗します。(注:rabbitmqキューはすでに稼働しています-私はPOCの一部として使用しています)。具体的には、アサーションで失敗します。

Assert.AreEqual(1, localBus.HasSubscription<CreateElection>().Count());
Assert.AreEqual(1, localBus.HasSubscription<TerminateElection>().Count());

誰かが私がここで何が起こっているのかを理解するのを手伝ってもらえますか?私はMTを初めて使用するので、何かが足りない、または何かが正しく構成されていないことを完全に予想しています。

メッセージサブスクリプションが登録されていない場合、バスは(コンシューマーが登録されていても)どのコンシューマーにも配信できないと想定するのは正しいですか?

どんな助けでも大歓迎です!

4

2 に答える 2

4

RabbitMQを使用すると、メッセージが公開されるまでサブスクリプションはアウトバウンドバスに追加されません。これは、クラスがどのように検査され、適切な交換へのアウトバウンドエンドポイントが作成されてパイプラインに追加されるかによるものです。

そうです、このテストはRabbitMQで失敗しますが、実際にはメッセージが公開されたときに正しく機能します。

HasSubscription()呼び出しは、実際には、コンシューマーなどがループバックトランスポートを使用して適切に構成されていることを確認するためのものであり、実際には統合の問題ではなく、内部MassTransitコードが機能していることを確認するためのものです。

したがって、これらのタイプのいずれかのPublish()呼び出しを追加してから、HasSubscription()拡張メソッドを呼び出すと、パスされます

于 2012-12-10T01:04:34.260 に答える
1

MassTransitが問題のメッセージタイプの交換を作成するかどうかを確認します。メッセージは取引所に送信され、すべてのコンシューマキューは取引所にバインドされます。Rabbitの設定を見て、それが起こったかどうかを確認することもできます。また、コンシューマーが登録されていない場合、メッセージは配信されません。Chrisは、エラーにオプションを追加する作業を行っています。コンシューマーが存在するため、コードで処理できます。

メーリングリストhttps://groups.google.com/forum/?fromgroups=#!forum/masstransit-discussに参加して、サポートを受けます。あなたが必要な場所にあなたを連れて行くために正しい質問をすることができる人はもっとたくさんいます。

于 2012-12-08T13:51:58.207 に答える