24

私はRabbitMQを初めて使用し、私が熟考しているこの問題への優れたアプローチを考えていました。キューにサブスクライブし、特定の条件を満たすメッセージのみをプルするサービスを作成したいと思います。たとえば、特定の件名ヘッダーがメッセージに含まれている場合です。

私はまだRabbitMQについて学んでおり、これに取り組む方法のヒントを探していました。私の質問は次のとおりです。コンシューマーはどのようにしてキューから特定のメッセージのみをプルできますか?プロデューサーはどのようにしてメッセージに件名ヘッダーを設定できますか(それが正しい用語である場合でも)

4

4 に答える 4

33

RabbitMQはこの状況に最適です。やりたいことをするためのオプションがたくさんあります。理解を深めるために、ドキュメントを読むことをお勧めします。トピックまたは直接交換を使用することをお勧めします。トピックはより柔軟です。こんなふうになります。

プロデューサーコードはRabbitMQブローカーに接続し、特定の名前でExchangeを作成します。

プロデューサーは交換のために公開します。公開される各メッセージは、ルーティングキーを使用して公開されます。

コンシューマーはRabbitMQブローカーに接続します。

消費者はキューを作成します

コンシューマーは、キューをエクスチェンジにバインドします。これは、プロデューサーで定義されているのと同じエクスチェンジです。バインディングには、この特定のコンシューマーに必要な各メッセージのルーティングキーも含まれます。

ログメッセージを公開していたとしましょう。ルーティングキーは、「log.info」、「log.warn」、「log.error」のようなものである可能性があります。プロデューサーによって公開された各メッセージには、関連するルーティングキーが添付されます。次に、すべてのエラーメッセージを送信して電子メールで送信するコンシューマーと、すべてのエラーメッセージをファイルに書き込むコンシューマーがあります。したがって、メール送信者は、ルーティングキー「log.error」を使用して、キューから交換へのバインディングを定義します。このように、エクスチェンジはすべてのメッセージを受信しますが、メール送信者用に定義されたキューにはエラーメッセージのみが含まれます。ファイルロガーは、同じ交換にバインドされた新しい個別のキューを定義し、異なるルーティングキーを設定します。必要な3つの異なるルーティングキーに対して3つの個別のバインディングを実行するか、ワイルドカード「log。*」を使用することができます。

これは、やりたいことをどのように達成できるかを示す簡単な例です。

コード例については、ここで具体的に番号チュートリアル番号5を参照してください。

于 2012-06-21T16:41:45.037 に答える
-1

RabbitMQ からメッセージを取得するには、最初に RabbitMQ サーバーに接続する必要があります

public WebClient GetRabbitMqConnection(string userName, string password)
{
    var client = new WebClient(); 
    client.Credentials = new NetworkCredential(userName, password);
    return client;
}

以下のコードを使用して、RabbitMQ からメッセージを取得します。

public string GetRabbitMQMessages(string domainName, string port, 
    string queueName, string virtualHost, WebClient client, string methodType)
{
    string messageResult = string.Empty;
    string strUri = "http://" + domainName + ":" + port + 
                    "/api/queues/" + virtualHost + "/";
    var data = client.DownloadString(strUri + queueName + "/");
    var queueInfo = JsonConvert.DeserializeObject<QueueInfo>(data);
    if (queueInfo == null || queueInfo.messages == 0)
               return string.Empty;
    if (methodType == "POST")
    {
        string postbody = "  
        {\"ackmode\":\"ack_requeue_true\",\"count\":
         \"$totalMessageCount\",\"name\":\"${DomainName}\",
         \"requeue\":\"false\",\"encoding\":\"auto\",\"vhost\" :
         \"${QueueName}\"}";
         postbody = postbody
                       .Replace("$totalMessageCount", queueInfo.messages.ToString())
                       .Replace("${DomainName}", domainName)
                       .Replace("${QueueName}", queueName);
         messageResult = client.UploadString(strUri + queueName + 
                          "/get", "POST", postbody);
    }
    return messageResult;
} 

これは、RabbitMQ の実装に役立つと思います。

于 2019-01-13T14:36:00.350 に答える