JBoss / WildFly (全部俺) Advent Calendar 2013の17日目です。
起動時や停止時になにか処理を実行したいという要件はチラホラあります。そういうときに使える拡張ポイントとなるコンポーネントを見ていきます。
- @PostConstruct/@PreDestroy on @Startup @Singleton EJB
- ServletContextListener
- ServletContainerInitializer
- sar (MBean Service Archive)
- pojo (POJO deployment)
標準で利用できるのは上の三つです。JBoss EAPやWildFlyではこれに加えて下のふたつ、sarと呼ばれるMBeanをパッケージングしたものや、ふつうのPOJOをインスタンス化してメソッドを実行することもできます。
sarやpojoについてはas7-hello-serviceというのをサンプルとして以前作っています。両方とも基本的に以下の4つのライフサイクルメソッドを定義したクラスを作成すればOKです。
- create
- start
- stop
- destroy
sarの場合はMBeanインタフェースと合わせてMETA-INF/jboss-service.xmlを含めてjarにパッケージングします。MBeanServerに登録されるので、運用系のツールを書くのにとても便利です。sarはJBoss独自のデプロイメント拡張ですが、Singleton EJBを使ったMBean登録処理などに簡単に変換できるので、ポータビリティ的にも問題になりにくい拡張です。
pojoはMETA-INF/jboss-beans.xmlと一緒にパッケージングします。こちらはライフサイクルメソッド名を変更できます。sarのJMX経由のような外部から操作するインタフェースはpojoにはありません。こちらも独自要素はデプロイメントディスクリプタであるjboss-beans.xmlしかないので、sarと同じように標準にすぐ移行できます。
アプリがデプロイされる前後、アプリ内ではなく外で処理を行いたいという場合はデプロイメント同士のデプロイ順序制御を使えばデプロイメントの依存を定義できます。ここはポータビリティ的にはグレーなので、なるべくアプリに閉じた構成のほうが良いです。