これはその一例ですが、マークされた答えが私をこれに導いたものです。
var factory = new ConnectionFactory
{
HostName = "MY_HOST_NAME",
UserName = "USERNAME",
Password = "PASSWORD",
RequestedHeartbeat = 30
};
using (var connection = factory.CreateConnection())
{
connection.ConnectionShutdown += (o, e) =>
{
//handle disconnect
};
using (var model = connection.CreateModel())
{
model.ExchangeDeclare(EXCHANGE_NAME, "topic");
var queueName = model.QueueDeclare();
model.QueueBind(queueName, EXCHANGE_NAME, "#");
var consumer = new QueueingBasicConsumer(model);
model.BasicConsume(queueName, true, consumer);
while (!stop)
{
BasicDeliverEventArgs args;
consumer.Queue.Dequeue(5000, out args);
if (stop) return;
if (args == null) continue;
if (args.Body.Length == 0) continue;
Task.Factory.StartNew(() =>
{
//Do work here on different thread then this one
}, TaskCreationOptions.PreferFairness);
}
}
}
これについて注意すべき点がいくつかあります。
トピックに # を使用しています。これですべてが掴めます。通常、トピックで制限します。
プロセスをいつ終了するかを決定するために、「stop」という変数を設定しています。その変数が true になるまで、ループが無限に実行されることに気付くでしょう。
Dequeue は 5 秒間待機し、新しいメッセージがない場合はデータを取得せずに終了します。これは、停止変数をリッスンし、実際にある時点で終了することを保証するためです。値はお好みで変更してください。
メッセージが届くと、新しいスレッドで処理コードを生成します。現在のスレッドは、rabbitmq メッセージをリッスンするためだけに予約されています。ハンドラーの処理に時間がかかりすぎる場合、他のメッセージの速度が低下することは望ましくありません。実装によっては、これが必要な場合と必要でない場合があります。ただし、メッセージを処理するコードの作成には注意してください。実行に 1 分かかり、1 秒未満の時間でメッセージを取得すると、メモリが不足するか、少なくとも深刻なパフォーマンスの問題が発生します。