- - PR -
戻り値のある非同期メソッド
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-12-25 12:24
何度か投稿させてもらっています。
いつもお世話になっています。 さっそくですが質問させていただきます。 私はいま、分散オブジェクトミドルウェアのHORBを利用して戻り値のある非同期メソッドの実装を行っています。 基本的な呼び出し方や,戻り値の受け取り方などはなんとか把握できていると思うのですが、一点だけどうしてもわからないことがあります。 まず、今現在の目的として 戻り値のある非同期メソッドが2つのサーバに向けて呼び出され、処理が早く終わった順に結果を返したい としているのですが、早く終わった方の結果をreturnすると、他方の処理も強制的に解除されてしまっているのです。 私が目指しているのは、早く終わった方のサーバの結果をクライアントにreturnしつつ、他方のサーバでも処理を完了させて、二つのサーバの値に一貫性を持たせたいのです。 このような場合には、どのようにすれば処理を継続しつつ、クライアントに結果を先に渡せるのでしょうか? やはり、run()メソッドを用いたコールバックを利用するべきなのでしょうか? その際、もし1つのクラス内に戻り値を受け取る非同期メソッドが複数ある場合にはどのようにrun()メソッドを書けばいいのでしょうか? 以下に私が現在実装しているプログラムを記載いたしますのでアドバイスをいただけたらと思います。よろしくお願いします。 プログラムソース ************************************************* import horb.orb.*; class PersonalData_Proxy_Active implements AsyncMethodHandler { PersonalData_Proxy proxys[]; HorbURL[] url = new HorbURL[2]; // Object end = new Object(); public PersonalData_Proxy_Active(){ } public PersonalData_Proxy_Active(String objname){ //入力されたobjnameを用いてName_Serverに照会し、オリジナルとレプリカのobjが置かれている場所を自動的に探して接続する //NSの置き場所は固定にする予定 Name_Server_Proxy ns = new Name_Server_Proxy("horb://localhost:8889/ns"); //nsdata[]のそれぞれの中身は、nsdata[0] オリジナルの場所 nsdata[1] レプリカの場所 String nsdata[] = ns.getFrom_objname(objname).split(","); System.out.println("☆nsdata="+nsdata[0]+" "+nsdata[1]); //取得したIPアドレスから二つのproxyを作成し、_setHandler()を呼び出しておく proxys = new PersonalData_Proxy[2]; try{ this.url[0] = new HorbURL(nsdata[0],8889,objname); proxys[0] = new PersonalData_Proxy(url[0]); proxys[0]._setHandler(this, 0); }catch(Exception e){} try{ this.url[1] = new HorbURL(nsdata[1],8889,objname+"_replica"); proxys[1] = new PersonalData_Proxy(url[1]); proxys[1]._setHandler(this, 1); }catch(Exception e){} } public synchronized String getName() { ResultAsync[] rc = new ResultAsync[2]; try{rc[0] = proxys[0].getName_Request();}catch(Exception e){} try{rc[1] = proxys[1].getName_Request();}catch(Exception e){} String s = null; int count = 0; while(count != 1){ for(int i=0;i<2;i++){ try{ if(rc[i] != null && rc[i].isAvailable()){ s = proxys[i].getName_Receive(rc[i]); count++; System.out.println("tag= "+rc[i].getTag()); rc[i] = null; } }catch(Exception e){} } } return s; } public synchronized void setName(String name) { ResultAsync[] rc = new ResultAsync[2]; try{rc[0] = proxys[0].setName_Request(name);}catch(Exception e){} try{rc[1] = proxys[1].setName_Request(name);}catch(Exception e){} } [ メッセージ編集済み 編集者: しんにぃ 編集日時 2008-12-25 12:28 ] |
1