そして、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)。 } }