バスにコンシューマがないC#とRabbitMQを使用して、MassTransit v3でパブリッシュ専用バスを実装しようとしています。このコンセプトは、メッセージが公開され、キューに入れられると、別のマイクロサービスがキューからメッセージを消費します。 this SO answerを見ると、メッセージが実際にキューに入れられるように受信エンドポイントを指定する必要があります。しかし、これはcontradict the common gotchas in the MassTransit docsに現れ、If you need to only send or publish messages, don’t create any receive endpoints
と書かれています。 、私は予想通りRabbitMQのキュー内のメッセージが表示され、これは、コンソールにHello Worldのを書き込みMyConsumer
によって消費され、メッセージが続いている。このサンプルでC#とRabbitMQでMassTransit v3でパブリッシュ専用バスを実装
public class Program
{
static void Main(string[] args)
{
var bus = BusConfigurator.ConfigureBus();
bus.Start();
bus.Publish<IItemToQueue>(new ItemToQueue { Text = "Hello World" }).Wait();
Console.ReadKey();
bus.Stop();
}
}
public static class BusConfigurator
{
public static IBusControl ConfigureBus()
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), hst =>
{
hst.Username("guest");
hst.Password("guest");
});
cfg.ReceiveEndpoint(host, "queuename", e =>
{
e.Consumer<MyConsumer>();
});
});
return bus;
}
}
public interface IItemToQueue
{
string Text { get; set; }
}
public class ItemToQueue : IItemToQueue
{
public string Text { get; set; }
}
public class MyConsumer : IConsumer<IItemToQueue>
{
public async Task Consume(ConsumeContext<IItemToQueue> context)
{
await Console.Out.WriteLineAsync(context.Message.Text);
}
}
:ここ
は、いくつかのサンプルコードですキューから削除されました。私は上から以下のコードを削除したときにしかし、サンプルを再実行します。
一時キューは、(生成された名前を持つ)を作成し、メッセージが決してに配置されるように思われていないcfg.ReceiveEndpoint(host, RabbitMqConstants.ValidationQueue, e =>
{
e.Consumer<MyConsumer>();
});
一時的なキュー。バスが停止すると、このキューは削除されます。
ReceiveEndpointが指定されていると、パブリッシャプログラムのキューからメッセージが消費され、削除されます(コンシューママイクロサービスがキューに入れられたアイテムを処理しないことを意味します)。 RecieveEndpointが指定されていないと、一時的なキューが使用され(消費者のマイクロサービスはこの一時的なキューの名前を知らない)、メッセージはキューに入らず、キューが停止したときに削除され、プログラムがダウンした。
an example of a send only bus in the MassTransit docsがありますが、それはかなり基本的なので、私は誰にも何か提案があったのだろうかと思っていましたか?
パブリッシャ/送信者にエンドポイントを受け取る必要はありませんが、どこかにメッセージが必要な場合や、メッセージ交換にバインドされているキューがない場合でも、メッセージはどこにもルーティングされずに送信されます。 –