山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

JBossサーバーでAOPを使う

一時期少し話題になったAOP

今回使ってみたのですがJBossサーバー上で使うのに意外に

苦労しました。

情報もあまりなかったので事例を共有します。

スタンドアロンで使うやり方はいろいろ紹介しているサイトが

ありましたがなぜかJBossサーバー上でやった例を紹介している

サイトがありません。

・構成

JBoss 4.2.3 (4.2.2)
JRE6

・手順

AOPのアップデート

JBoss4に組み込まれているJBoss AOPは1.5.xなので2.xに

アップデートします。

JBoss Communityのサイトで jboss-aop-2.1.8.GA.zip を

ダウンロード。

zipファイルを展開します。

展開したファイルの中の、以下のファイルを編集します。

jboss-40-install/jboss-aop-jdk50.deployer/jboss.properties

jboss.home= のところをJBossのパスに変えます。

Windowsの場合、\は/に変えないといけないので注意。

antでbuild.xmlを実行するとインストールされます。

run.batに以下の行を追加します。

set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME% -javaagent:pluggable-instrumentor.jar

場所は下のほうのechoの上あたりがよいのではないかと思います。

これはWindowsの例なので、Linuxの場合はrun.shファイルになり、

書き方も若干変わると思われます。

<JBossインストールディレクトリ>/server/<configuration>/deploy/jboss-aop-jdk50.deployer/META-INF/jboss-service.xml

を編集します。

<attribute name="EnableLoadtimeWeaving">true</attribute>

のように、EnableLoadtimeWeavingをtrueにします。

こうしておくと実行時に読み込んだクラスを改変して処理を追加

します。

他にaopcというコマンドでコンパイル時に処理を織り込むやり方が

あります。

deployディレクトリの下に *-aop.xml というファイルを定義して

配置します。

サンプルはこんな感じです。

<?xml version="1.0" encoding="UTF-8"?>
<aop xmlns="urn:jboss:aop-beans:1.0">
  <interceptor class="com.oisix.test.MyInterceptor" scope="PER_VM"/>
  <bind pointcut="execution(* com.oisix.test..->*())">
    <interceptor-ref name="com.oisix.test.MyInterceptor"/>
  </bind>
</aop>

インターセプターのクラスを用意します。

例です。

package com.oisix.test;

import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.Invocation;

public class MyInterceptor implements Interceptor {

    @Override
    public String getName() {
        return "MyInterceptor";
    }

    @Override
    public Object invoke(Invocation invocation) throws Throwable {
        System.out.println("test");
        Object em = invocation.invokeNext();
        System.out.println("MyInterceptor:" + em.toString());
        return em;
    }

}

なんとメソッドの返り値を捕捉することができます。

今更ながらAOPすごい。

しかし、地味であまり使い道がないし、結構使うのが大変。

動かないときになんで動かないかよくわからないのが大変でした。

最新のJBossだともっとわかりやすく行けるようになってますかね。

次回、何に使おうとしているのか紹介します。