DispatchContextクラスによって、次のようにユーザ定義イベントが利用できます。
イベントリスナの登録: イベントリスナとなるオブジェクトを必要なだけDispatchContextに登録します。
ユーザ定義イベントの発生: DispatchContextにイベントの発生を指示することにより、登録されている全てのイベントリスナが呼び出されます。
例えば、以下のようにエラー発生時にリソースを開放する処理に利用できます。
ファイルやネットワークコネクションなどのリソースを確保したときに、そのリソースを開放するためのイベントリスナを登録します。
エラーが発生したときに、イベントの発生をDispatchContextに指示します。
イベントリスナが呼び出されリソースが開放されます。
このようにユーザ定義イベントを利用することにより、エラーを検出した処理は、開放すべきリソースがどれであるのかを把握する必要がなくなります。 ユーザ定義イベントは以下の手順で使用します。
DispatchContextクラスのaddUjiEventListenerメソッドでイベントリスナのオブジェクトをDispatchContextに登録します。
DispatchContextクラスのfireUjiEventメソッドで、イベントの発生を指示します。このとき、ユーザ定義イベントのオブジェクトをfireUjiEventの引数に渡します。これにより、登録されている全てのイベントリスナが呼び出されます。
ユーザ定義イベントを表すクラスはcom.fujitsu.uji.event.UjiEventクラスを継承して次のように作成します。
public class MyEvent extends com.fujitsu.uji.event.UjiEvent {
static public final int TYPE0=0;
static public final int TYPE1=1;
protected int type;
// typeはイベントの種類を、sourceはイベントの発生源となったオブジェクトを
// 表します。
public MyEvent(int type, Object source) {
// 以下に初期化する手続きを記述してください。
super(source);
this.type=type;
}
public int getType() {return type;}
}コンストラクタは必ずObjectの引数が必要です。これは、イベントの発生源となったオブジェクトを表します。nullは指定できません。
イベントリスナはcom.fujitsu.uji.event.UjiEventListenerインタフェースを実装して次のように作成します。
import com.fujitsu.uji.event.UjiEvent;
import com.fujitsu.uji.event.UjiEventListener;
public class MyListener implements UjiEventListener {
java.io.File file;
public MyListener(java.io.File file) {
this.file=file;
}
// このメソッドは、イベントが発生したときに呼び出されます。
public void eventRaised(UjiEvent evt) {
if (evt instanceof MyEvent &&
((MyEvent)evt).getType()==MyEvent.TYPE1) {
file.delete();
}
}
}ビジネスクラスでは、イベントリスナとイベントを次のように使用します。
public void startup(DispatchContext context) {
context.addUjiEventListener(new MyListener(new File("foo"));
....
}
public Object postprocess(DispatchContext context,Object result) {
....
if (failed) {
context.fireUjiEvent(new MyEvent(MyEvent.TYPE1,this));
}
}イベントリスナをDispatchContextから削除するには、removeUjiEventListenerメソッドを使用します。
登録されたイベントリスナはリクエストの処理が終了するまで有効です。リクエストの処理とは、Webアプリケーションの場合は<uji:dispatch/>の実行、EJBセションBeanの場合はビジネスメソッドの呼び出しです。