ウサギは、メッセージ・コールバックを使用して、信頼性をCorrelationIDの

  そして、CorrelationIdをプロセスのコールバックに関連するメッセージIDを使用してフローチャートを置きます

  

  • クライアントが起動すると、匿名のコールバックキューを作成します。
  • RPC要求の場合、クライアントは2つのプロパティを持つメッセージ送信:  REPLY_TOを(コールバックキュー)とCORRELATION_ID(要求ごとに固有の値に設定)
  • 要求がに送信さrpc_queue  キュー
  • キュー上の要求を待っているRPC手順は、要求が発生した場合、それが使用されますREPLY_TO  現場作業を完了するために、キュー、およびクライアントの結果メッセージに返信し、
  • クライアントコールバックキュー、上のデータを待っているメッセージは、それがチェックCORRELATION_ID  プロパティを。 それは、要求内の値と一致した場合、応答はアプリケーション(TODO)に返されます

送信コールバック

        公共 ボイド SendCallback <T>(文字列トピック、T値、アクション< バイト []>コールバック、バイト優先順位= 1 
        { 
            EnsureDeclare(トピック)。
            VAR REPLYQUEUE = _model.QueueDeclare()QUEUENAME。
            VAR小道具= _model.CreateBasicProperties()。
            props.Priority = 優先; 
            props.ReplyTo = REPLYQUEUE。
            VAR。correlationIdの= Guid.NewGuid()のToString(" N " ); 
            props.CorrelationId =correlationIdの; 

            // 発表し
            _model.BasicPublish(_exchange、トピック、小道具、value.GetBuf()); 

            // 消費者のコールバックのためのメッセージ作成
            VAR callbackConsumer = 新新EventingBasicConsumer(_modelを); 
            _model.BasicConsume(キュー:REPLYQUEUEを、AUTOACK :trueに、消費者:callbackConsumer); 

            callbackConsumer.Received + =(モデル、EA)=> 
            { 
                IF(ea.BasicProperties.CorrelationId == correlationIdの)
                    コールバック(ea.Body); 
            }; 
        }

 

返信先によるメッセージの受信のために、メッセージを受信した後、メッセージを受信

        公共 ボイド SetReceiveCallback(文字列トピック、アクション< バイト []、IBasicProperties> 受信)
        { 
            EnsureDeclare(トピック)。
            VaRの消費者= 新しいEventingBasicConsumer(_model)。
            consumer.Received + =(モデル、EA)=> 
            { 
                VARの性質= ea.BasicProperties。
                VAR replyProerties = _model.CreateBasicProperties()。
                replyProerties.CorrelationId = properties.CorrelationId。
                replyProerties.ReplyTo = properties.ReplyTo。
                受信(ea.Body、replyProerties)。
                _model.BasicAck(ea.DeliveryTag、); 
            }。
            _model.BasicConsume(トピック、、消費者)。
        }

 

ユニットテストコード

    [順序(1 )]
     パブリック クラスRabbitCallbackTest 
    { 
        [ファクト、注文(1 )]
         公共 ボイドServerCallback()
        { 
            _rabbitSvr = 新しい Aster.Itms.Core.Data.Provider.Rabbit(新しい接続()
            { 
                Ipが = " ローカルホスト" 
                ポート = 5672 
                ユーザー = " ゲスト" 
                パスワード =" ゲスト" 
            }、"" ); 

            _rabbitSvr.SetReceiveCallback(" トピック" 、ServerReceiveCommand)。
        } 


        プライベート 静的 揮発性Aster.Itms.Core.Data.Provider.Rabbit _rabbitSvr。
        【事実は、オーダー(2 )]
         公共 ボイドClientCallback()
        { 
            VAR _rabbitSvr = 新しい Aster.Itms.Core.Data.Provider.Rabbit(新しい接続()
            { 
                Ipが = " ローカルホスト"
                ポート = 5672 
                ユーザー = " ゲスト" 
                パスワード = " ゲスト" 
            }、"" ); 

            ストリングヴァル= $ " 发送消息{Guid.NewGuid()のToString(" N " )} " 

            _rabbitSvr.SendCallback < 文字列 >(" トピック"、ヴァル、ClientReceiveCommand、1 );

          バイト[]ボディ)
        { 
            VARの結果= body.To < 文字列 > (); 

            // 結果が返送されます

            Console.WriteLineをを($ " サーバーから返されたメッセージを受信:検索結果を{} " ); 

            Assert.NotEmpty(結果) ; 
        } 

        プライベート 静的 ボイド ServerReceiveCommand(バイト[]本体、IBasicProperties replyProps)
        { 
            VARの結果= body.To < ストリング > (); 

            Assert.NotEmpty(結果); 

            Console.WriteLineを($ " サービスが受信{結果}、CorrelationIdを:{} replyProps.CorrelationId "); 

            int型(その結果、.TryParse アウト INT newResult)。

            もし(!文字列.IsNullOrEmpty(replyProps.ReplyTo))
                _rabbitSvr.Send(replyProps.ReplyTo、$ " {Convert.ToInt32(newResult)+千} " 、replyProps)。
        } 
    }

 

おすすめ

転載: www.cnblogs.com/leeolevis/p/RabbitmqCallback.html