2017-10-17 9 views
0

私は片面にいくつかのメッセージを送信し、別のアプリケーションで受信するRabbitMqでキューを作成したいと思います。 I'amは、次のコードでこれを行う:Masstransit ReceiveFromメソッドと消費者の動作によって混乱しました

return ServiceBusFactory.New(x => 
     { 
      var uriString = string.Format(@"rabbitmq://{0}/{1}/{2}?prefetch={3}", host, virtualHost, queueName, 
       prefetch < 1 ? 1 : prefetch); 
      x.UseRabbitMq(r => r.ConfigureHost(new MessageUrn(uriString), h => 
      { 
       h.SetUsername(user); 
       h.SetPassword(password); 
       h.SetRequestedHeartbeat(3); 

      })); 

      x.ReceiveFrom(uriString); 

      x.UseJsonSerializer<ServiceBusConfigurator>(); 

      f(x); 
     }); 

MessageUrnのURIとReceiveFromは、そうでない場合ReceiveFromメソッドに対して指定されたURI、同じURIを持つバスの終点を決定する必要があります。しかし、それは私の出版社が同じキューの消費者でもあることを意味します。受信者がいない場合、すべてのメッセージはqueuename_errorキューに移動します。受信機があると、すべてが正常であるようです。

私は間違っていますか?私はなぜメッセージがエラーキューに送られるのか理解しています。パブリッシャーは購読していませんが、同時に彼は消費者ですから、 エラーが発生します。受信者が(再)起動したときにエラーキューからメッセージを回復することは可能ですか?

masstransitは2.10.0.0です。

ありがとうございます。

+0

masstransitを<3.0.0バージョンにアップグレードすることをお勧めします。より優れたAPIがあります。 masstransit v3以降のドキュメントは次のとおりです。http://masstransit-project.com/MassTransit/ –

+0

それ以降のバージョンは使用できません。 – Sharov

答えて

2

.ReceiveFrom()のアドレスは、サービスごとに一意である必要があります。同じメッセージタイプの消費者が同じコンシューマを持つサービスがある場合は、アドレスが共有されている必要があります。同じRabbitMQサーバを使用するサービス間の唯一の共通点は、ホスト(および使用されている場合は仮想ホスト)です。それ以外の場合は、異なる必要があります。

はい、パブリッシャーが購読していないため、エラーキューに入ります。パブリッシャーに別のキュー名を付けて、問題を解決します。

+0

ありがとうございます。それでも私はそれを得ることができません - なぜ私はメッセージを送信したい場合はReceiveFrom()を指定する必要がありますか?なぜConfigureHostメソッドのuriでは十分ではありませんか?また、別のURIストリング(ConfigureHostとReceiveFromに1つ)を指定すると、ReceiveFromメソッドで指定されたキューにメッセージが送信されます。かなり奇妙な... – Sharov

+0

v2 APIの時代と進化の成果物です。 V3 APIはもっと理にかなっていますが、あなたはアップグレードできないと言ったので、あなたはそれに固執しています。 –

+0

v3がこれを避けることができれば、私は移行を試みます。 RMQ固有のものだと思います。 – Sharov

関連する問題