:http://blog.csdn.net/paul_wei2008/article/details/19355681
:
– RPC
–SOA
-Apache MINA Reactor , tcp
Dubbo NIO ,
,
, :
clientスレッドはリモートインタフェースを呼び出し、一意のID(例えばランダム文字列、UUIDなど)を生成し、DubboはAtomicLongを使用して0から数字を積算するである.
は、呼び出されたインタフェース名、メソッド名、パラメータ値リストなどのパッケージ化されたメソッド呼び出し情報と、処理結果のコールバックオブジェクトcallbackとをすべてカプセル化し、1つのオブジェクトobject を構成する.
呼び出し情報を専門に格納グローバルConcurrentHashMapにput(ID,object) IDとパッケージング方法呼び出し情報をオブジェクトconnRequestにカプセル化し、IoSessionを使用する.write(connRequest)非同期送信現在のスレッドはcallbackのget()メソッドを使用してリモートリターンの結果を取得しようとし、get()内部ではsynchronizedを使用してコールバックオブジェクトcallbackのロックを取得し、結果が取得されたかどうかを検出してから、callbackのwait()メソッドを呼び出し、callbackのロックを解放し、現在のスレッドを待機状態にします. サービス側は要求を受信して処理した後、結果(この結果には前のID、すなわち返信が含まれている)をクライアントに送信し、クライアントsocketがメッセージを専門に傍受するスレッドに接続してメッセージを受信し、結果を分析し、IDを取り、前のConcurrentHashMap里面get(ID)からcallbackを見つけ、メソッド呼び出し結果をcallbackオブジェクトに設定する. スレッドをリスニングし、synchronizedを使用してコールバックオブジェクトcallbackのロック(wait()が前に呼び出されたため、そのスレッドはcallbackのロックを解放した)を取得し、notifyAll()を使用して、前の待機状態にあるスレッドを起動して(callbackのget()メソッドを実行し続けると呼び出し結果が得られる)を実行し、これでプロセス全体が終了する. 現在のスレッドはどのようにして「一時停止」させ、結果が戻ってきたら、後で実行しますか? 答え:先生は1つのオブジェクトobjになって、1つのグローバルmapの中でput(ID、obj)を保存して、synchronizedでobjロックを取得して、更にobjを呼び出します.wait()は、現在のスレッドを待機状態にし、別のメッセージ傍受スレッドは、サービス側の結果が来るまで待ってからmap.get(ID)はobjを見つける、synchronizedでobjロックを取得し、objを呼び出す.notifyAll()は、前に待機しているスレッドを起動します.
前述したように、Socket通信はフルデュプレクス方式であり、複数のスレッドが同時にリモートメソッド呼び出しを行う場合、client server間に確立されたsocket接続には双方から送信されるメッセージが多く、前後の順序も乱れている可能性があり、serverが結果を処理した後、結果メッセージをclientに送信し、clientは多くのメッセージを受信し、どのメッセージの結果が元のスレッドで呼び出されたかどうやって知っていますか? 答え:IDを1つ使用して、一意にして、サービス側に渡して、サービス側が戻ってきて、結果が元のどのスレッドだったかを知ることができます.
既存
0人がメッセージを発表し、猛撃->
ここで<<-ディスカッションに参加
ITeye推奨
—ソフトウェア人材免言語低保証渡米有給大学院!—