はじめに
RabbitMQを使ってバックエンド間通信を実現している時にコンシューマ側の動作を試そうと思ったら、普通メッセージをパブリッシュする側のコンポーネントが必要になってしまいます。
どうにかコンシューマ側のコンポーネントだけ試せないか?というシーンにおいて、RabbitMQのManagementプラグインからメッセージをパブリッシュする方法が有効です。
前提
RabbitMQはローカル環境にインストール済みであること
RabbitMQ Managementが立ち上がっていること
Consumerを用意
.NetCore2.2でWebアプリケーションのソリューションを立ち上げ、Nugetを用いてMassTransitをインストールします。
その後、以下のコードを転記していきます。
まず、サンプル用のクラスを用意します。
using MassTransit;
namespace massTransitEx
{
public class ExClass : IConsumer
{
public string Message { get; set; }
}
}
次に、Program.csにConsumerを作成するコードを書きます。
using System;
using MassTransit;
namespace massTransitEx
{
public class Program
{
public static void Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
sbc.ReceiveEndpoint(host, "TestQueue",
ep =>
{
ep.Handler<ExClass>(context => { return Console.Out.WriteLineAsync(context.Message.Message); });
});
});
bus.Start();
}
}
}
RabbitMQのManagementプラグインからメッセージ送信
コードが作成出来たらビルド&Runして、RabbitMQのマネジメント画面内、Exchangeタブから、TestQueueという名前のQueueを選択します。
下部メニューから、Publish messageを開き、Payloadの欄に下記の内容をコピーしてPublish messageをクリックします。
{
"messageType": [
"urn:message:massTransitEx:ExClass"
],
"message": {
"message": "Hi"
}
}
プロジェクトをビルドしたIDEのコンソールで、"Hi"と表示されれば成功です!
この話を一般化すると?
MessageQueueを用いてコンポーネント間の通信を実現している場合、メッセージをコンシューマ側に送るにはパブリッシャを起動して送信する方法のほかに、コンシューマに向けて直接メッセージを送信する方法もあります。
今回はRabbitMQという環境下での方法の一つを紹介しましたが、他のメッセージング方法を用いている場合でもこの発想はそれぞれに当てはまると思いますので、ぜひ探してみてください。