Recoveryアドバイスをもつ アスペクト指向システム

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

Remote Method Invocation
コンパイラ 2011年11月14日
IO - 入出力 小西 亨.
アプレット (Applet)について.
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
プログラミング基礎I(再) 山元進.
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
JavaServlet&JSP入門 01K0018 中村太一.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー
独習Java ・ 12.1  インターネットアドレス ・ 12.2  サーバーソケットとソケット  12月 19日    小笠原 一恵.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
HTTPプロトコルとJSP (1) データベース論 第3回.
AspectScope によるアスペクトとクラスのつながりの視覚化
の まとめ 2007/04/02 (Mon) / d;id:hzkr
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
RMI ソフトウェア特論 第6回 /
アスペクト指向プログラミングと Dependency Injection の融合
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
補足説明.
J2EEアプリケーションにおける アプリケーションレベルスケジューリング
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
コンパイラの解析 (4) 例外処理.
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
暗黙的に型付けされる構造体の Java言語への導入
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
アスペクト指向言語による 例外処理の記述方法の改善
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
Java Bytecode Modification and Applet Security
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
クラスファイルの構造解析(2) 2003年6月23日 海谷 治彦.
活性化のタイミング制御の実装を分離記述可能な分散動的アスペクト指向言語
既存Javaプログラム向け 分散化支援システムの開発
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
ソフトウェア制作論 平成30年11月21日.
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
new Calc(7,3).divInt()実行前
Java における 先進的リフレクション技術
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
C言語 はじめに 2016年 吉田研究室.
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとデータ構造演習(7月1日) 例外処理 2019/5/8.
分散 Java プログラムのための アスペクト指向言語
Josh : バイトコードレベルでのJava用 Aspect Weaver
同期処理のモジュール化を 可能にする アスペクト指向言語
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

Recoveryアドバイスをもつ アスペクト指向システム 熊原奈津子 石川零 西澤無我 光来健一 千葉滋 (東京工業大学)

例外処理の分離の重要性 例外処理とは ロジックとは分離して 書くべき 異常時の処理をまとめて記述したもの 正常時には実行されないコード Javaにはtry-catchがある 分離はできるが正常時の処理のすぐ下に書かなければならない try { //ファイルへの操作 File file = new File(); file.open(); file.read(); file.write(); : }catch(IOException e){ IOException が発生した 場合の例外処理内容 }

後から例外処理を記述したい(1) - 実験プログラム 分散環境で動くサーバの性能をテスト 故障マシンを発見した場合 ログを出力 他のマシンを使って再試行 故障 負荷 命令 コンソール マシンの絵 命令 負荷 コンソールマシン 命令 負荷 制御 プログラム サーバマシン クライアントマシン

後から例外処理を記述したい(2) 実験の途中で例外処理を変えたい 例外処理はロジックから離して記述すべき 最初は小規模なので例外処理なし 問題(故障)が起きたら必要に応じて追加 実験データが変だと思ったら例外を無視したせいだった 例外処理はロジックから離して記述すべき 元のプログラムを編集しないで、追加可能にしたい try-catch ロジックの近くに書くので、元のプログラムの編集が必要 データが変だと思ったら、実は故障していた。例外処理がなかったので。。。。 実験プログラムなので適当に(アジャイルに)書いてしまった。

元のプログラムを編集 class Sender{ public void sendCommand(String host, String command) throws Exception{   :   Socket s = new Socket(host, port);   DataOutputStream out   = new DataOutputStream(s.getOutputStream());   out.write(command);   out.close();   s.close();        :  //  続きの処理 } try{ } catch(SocketException e){ // 故障を見つけたらログを出力 } クライアントに ソケットを張る 命令を 送信 複数のホストに 命令を送信 for (int i = 0; i < hostName.length; i++){   new Sender().sendCommand(hostName[i], “./client.sh”); }

他のマシンを使って再試行(リカバリ) catch 節の中から try ブロックの先頭へ戻る try{ ホスト故障時には、自動的に復旧処理 try{   Socket s = new Socket(host, port);   DataOutputStream out = newDataOutputStream(    s.getOutputStream());   out.write(command);    out.close();   s.close(); } catch(SocketException e) {  ホストを変更して再試行 } Java には再試行を直接実現する 構文はない

GluonJR - Recovery アドバイスをもつ AOP System 例外処理をアスペクトとして記述 例外処理を分離 もとのロジックを壊さずに追加・削除が可能 例外処理に特化した pointcut 指定子を提供 Java バイトコード変換で実現 再試行するための特殊メソッド(retry)を用意 アドバイス内で利用可能 リカバリ処理を容易に記述できる

アスペクトとして分離 block ポイントカット指定子 recovery アドバイス ジョインポイントのペアを指定(try ブロック指定に相当) recovery アドバイス catch 節に相当 aspect FileSenderRecovery { pointcut region(): block (call(Socket.new(..)), call(* Socket.close())) && withincode(void     Sender.sendCommand(..)); recovery() throwing (SocketException e): region() { host = getAnotherHost(host); retry(); } Socket s = new Socket( host, port); DataOutputStream out = newDataOutputStream( s.getOutputStream()); out.write(command); out.close(); s.close(); アスペクトの単純な例と、適用されるプログラムの例 アスペクトで記述することにより、 もとのロジックを壊さず、例外処理を分離 分離して記述 元のプログラム アスペクト

再試行 特殊メソッド retry アドバイスの中で利用可能 block で指定した範囲の先頭に戻る 元のプログラム アスペクト aspect FileSenderRecovery { pointcut region(): block (call(Socket.new(..)), call(* Socket.close())) && withincode(void     Sender.sendCommand(..)); recovery() throwing (SocketException e): region() { host = getAnotherHost(host); retry(); } Socket s = new Socket( host, port); DataOutputStream out = newDataOutputStream( s.getOutputStream()); out.write(command); out.close(); s.close(); アスペクトの単純な例と、適用されるプログラムの例を載せる (先のスライドの例をそのまま載せるのが望ましい) リトライしやすい 元のプログラム アスペクト

GluonJR のプログラム例 Pointcut pc = Pointcut.and(new Pointcut() 例外処理を 追加したい 範囲を指定 Pointcut pc = Pointcut.and(new Pointcut()      .block(new Pointcut().call("Socket", "<init>"),          new Pointcut().call("Socket", "close")),  new Pointcut().withincode("Sender", "sendCommand")); RecoveryAdvice ra = new RecoveryAdvice(); ra.setPointcut(pc); ra.setThrowingException(“SocketException", "e"); ra.setBody("e.printStackTrace();"); new Weaver(ra).weave(); アドバイス ウィーブ

バイトコード変換 メソッドを実装している バイトコード ユーザから与えられる情報 始点・終点(ソースコード) 処理したい例外の型 例外が生じた場合に 実行したいコード ←始点 クラスファイル block で指定した範囲 ←終点 ・・・ メソッドの情報 ←例外ハンドラの先頭 アドバイス メソッドの属性 retry(); retry() は範囲の始点に戻る Exception Table に含まれる情報 Exception Table ・・・ 例外ハンドラがアクティブとなる バイトコードの範囲(始点・終点) 例外ハンドラがキャッチする 例外のクラス 例外ハンドラの先頭 ・・ 範囲・例外の種類・飛び先

実装の要点1: blockで指定する範囲の始点 ジョインポイント・シャドーではない ジョインポイントに直接対応するバイトコード命令ではない Invokevirtual, getfield 等 その命令を含むソースコード行の最初のバイトコード命令 retry() の実現のため アドバイス内から goto で戻っても bytecode verifier をパスする new Socket dup aload_1 iload 4 invokespecial Socket() astore 5 先頭の命令 Socket s = new Socket(host, port); Try ブロックの始点と終点には、スタックが空の状態で実行される命令の直前が選択される。 これは、recovery アドバイス内で記述できる retry() を実現するためである。 GluonJR での retry() は、bytecode 変換により、try ブロックの始点への goto 命令に置き換えられている。 もし try ブロックの始点のスタックの状態が空でなかった場合、 Retry() の直後に、スタック上にオペランドが積まれていることを想定した命令が実行されてしまう。 Retry() の実行後は、スタックの状態は空であるはずなので、 ここでスタックの整合性が保たれず、 Verify error が起きてしまう。 コンパイル JP Shadow

× ○ JVMのスタックの状態遷移図 ・・・・・ 例 Socket s = new Socket(host, port); コンパイル new Socket dup aload_1 iload 4 invokespecial Socket() astore 5 Socket s = new Socket(host, port); コンパイル new dup ・・・・・ int invokespecial str スタックは 空の状態 ref ref ref ref ref × ○ retry() で戻ってくる

実装の要点2: 動的なジョインポイントへの対応 if ポイントカット 実行時の式の計算結果で アドバイスの実行を制御 Recovery アドバイスの実装 アドバイス(catch 節)の冒頭で if の式を実行 false なら例外を投げなおす recovery() throwing (IOException e): region() && if(---){ //body of this advice } 変換 try{ : }catch (IOException e){ if (!---){throw e;} //body of this advice } False なら catch 節(アドバイス)を実行しないようにする

行アノテーション ジョインポイントの一種 if(・・・){ : }else { } @line(position = "begin") for(・・; ・・; ・・){ @line(position = "end") ジョインポイントの一種 GluonJRの文法拡張 block による範囲指定に利用 将来指定されそうな場所にジョインポイントがないとき、あらかじめ書いておく プリプロセッサで空のメソッド呼び出しに変換 通常の場合、性能に影響はない 自由に名前がつけられる 自由に名前がつけれる 行あのてーしょんは、ポイントカットできる Pointcut region(): block(@line(“begin”), @line(“end”))

関連研究 AspectJ handler ポイントカット after throwing アドバイス 既に try-catch 文がプログラムに含まれている場合、 catch 節の実行時をジョインポイントとして選択 after throwing アドバイス 選択されたジョインポイントが例外を投げて異常終了した場合に実行される 例外を補足する範囲の粒度がメソッドボディ Java の throws も同様の問題 リカバリ処理の実装には使えない 最後に必ず例外を投げなければならない Handler は、try-catch が含まれていない場合に、無力 Javaのthrowsを使って、wrapper をしかけても、粒度がメソッド本体

まとめ・今後の課題 GluonJRを提案 課題 例外処理をロジックと分離して記述可能 容易にリカバリできる Javaのライブラリとして実装 実装の完成度をあげる 行アノテーションの実装 プリプロセッサと @line ポイントカットの実装