/** * ログ取得コードをThrowableのcatch節として追加する * * @param pool Statementを含むプール * @param ctClass PreparedStatementを実装するクラス * @param behaviour behaviour * @throws CannotCompileException コンパイルができないときの例外 */ public static void convertCatch( final ClassPool pool, final CtClass ctClass, final CtBehavior behaviour) throws CannotCompileException { try { CtClass throwable = pool.get("java.lang.Throwable"); // メソッドの定義がない場合は実行しない。 final int MODIFIER = behaviour.getModifiers(); if (Modifier.isAbstract(MODIFIER)) { return; } // JavelinLogger#writeExceptionLogの呼び出しコードを作成する。 StringBuffer code = new StringBuffer(); // 後処理(例外場合) code.append(JAVELIN_RECORDER_NAME); code.append(".postProcessNG("); code.append("$e"); code.append(");"); // 例外を再throwする。 code.append("throw $e;"); // ログ取得コードをThrowableのcatch節として追加する。 behaviour.addCatch(code.toString(), throwable); } catch (NotFoundException nfe) { SystemLogger.getInstance().warn(nfe); } }
/** * ジョブ開始時、終了時、失敗時の処理を埋め込む。 * * @param ctMethod 埋め込み対象のメソッド * @throws CannotCompileException */ private void insertProcessesForJob(final CtBehavior ctMethod) throws CannotCompileException { ctMethod.insertBefore(MapReduceTaskMonitor.class.getName() + ".preProcess(this);"); ctMethod.insertAfter(MapReduceTaskMonitor.class.getName() + ".postProcess(this);"); ctMethod.addCatch( "{" + MapReduceTaskMonitor.class.getName() + ".postProcessNG(this, $e); $e.printStackTrace(); throw $e;}", throwableClass_); }