クライアントアプリケーションから、リクエスト/トランザクション(実行する操作(およびパラメーター)+transactionIDを含む)をリモートキューに送信しています。リモートサーバーは、ある時点で要求をデキューし、処理に時間がかかります。
処理が完了すると、クライアントキューに応答を送信します(適用可能な応答とtransactionIDを含む)...したがって、これは完全に「切断された」通信モードであり、クライアントが応答をにマップできる唯一の方法です。リクエストはtransactionIDを介して行われます。
メッセージ応答はクライアント側でデキューされ、元の要求と一致します(transactionIDに基づく)。
私が今していることは、クライアントがサーバーキューにリクエストを投稿すると、transactionIdとコールバック(デリゲート)を保持する辞書にコールバックを追加することです。これは、Dictionary<int, object>
transactionIdをコールバックにマッピングして戻し、操作の結果を呼び出します。
コールバック/デリゲートは、リクエストに応じてコールバックデリゲートのシグネチャが異なるため、オブジェクトとして保存されます(たとえば、応答がを返す場合とList<string>
、別の応答がを返す場合がありますint
)。
クライアントキューは、応答をデキューするときに、応答のタイプ(したがって、対応するコールバックのシグネチャ)を認識しているため、transactionIDに基づいてディクショナリからコールバックを取得します。次に、オブジェクトを対応するデリゲートタイプにキャストして戻し、コールバックを呼び出します。
このアプローチはあまり「セクシー」ではないと思いますが、そのようなタスクを実行する別の方法は実際にはわかりません。
これを実行するためのより良い方法はありますか?
問題が十分に明確でない場合は、私に知らせてください。いくつかの編集で明らかになります。