29.5. EJB タイマー設定
J2EE タイマーサービスにより EJB オブジェクトは指定した時間にタイマーコールバックの登録を行うことができるようになります。タイマーイベントは監査、報告、あるいはその他クリーンアップなど今後必要になってくる作業を行うために使用することができます。タイマーイベントは永続化されるようになっており、サーバーに障害が発生した場合であっても実行されなければなりません。EJB タイマーに対するコーディングは J2EE 仕様の標準部分となるため、このプログラミングモデルについてはここでは触れません。代わりに、ご使用の環境に最適な状態でタイマーを稼働させる方法を理解するために JBoss でのタイマーサービスの設定について見ていくことにします。
EJB タイマーサービスは
ejb-deployer.xml ファイル内のいくつかの関連 MBean によって設定されます。主要 MBean は EJBTimerService MBean です。
<mbean code="org.jboss.ejb.txtimer.EJBTimerServiceImpl" name="jboss.ejb:service=EJBTimerService">
<attribute name="RetryPolicy">jboss.ejb:service=EJBTimerService,retryPolicy=fixedDelay</attribute>
<attribute name="PersistencePolicy">jboss.ejb:service=EJBTimerService,persistencePolicy=database</attribute>
<attribute name="TimerIdGeneratorClassName">org.jboss.ejb.txtimer.BigIntegerTimerIdGenerator</attribute>
<attribute name="TimedObjectInvokerClassName">org.jboss.ejb.txtimer.TimedObjectInvokerImpl</attribute>
</mbean>
EJBTimerService には次のような設定可能な属性があります
- RetryPolicy: 再試行ポリシーを実装する MBean の名前です。この MBean は
org.jboss.ejb.txtimer.RetryPolicy interfaceに対応する必要があります。 JBoss はFixedDelayRetryPolicyという実装を1つ提供しており、これについては後ほど説明していきます。 - PersistencePolicy: タイマーイベント保存用の永続方法を実装する MBean の名前です。この MBean は
org.jboss.ejb.txtimer.PersistencePolicyインターフェースに対応しなければなりません。JBoss は NoopPersistencePolicy と DatabasePersistencePolicy の 2 つの実装を提供しており、これについては後ほど説明していきます。 - TimerIdGeneratorClassName: タイマー ID 生成方法を提供するクラスの名前になります。このクラスは
org.jboss.ejb.txtimer.TimerIdGeneratorインタフェースに対応していなければなりません。JBoss はorg.jboss.ejb.txtimer.BigIntegerTimerIdGenerator実装を提供しています。 - TimedObjectInvokerClassname: タイマーメソッド呼び出し方法を提供するクラスの名前になります。このクラスは
org.jboss.ejb.txtimer.TimedObjectInvokerインターフェースを実装していなければなりません。JBoss はorg.jboss.ejb.txtimer.TimedObjectInvokerImpl実装を提供しています。
使用される再試行ポリシー MBean 定義を次に示します。
<mbean code="org.jboss.ejb.txtimer.FixedDelayRetryPolicy"
name="jboss.ejb:service=EJBTimerService,retryPolicy=fixedDelay">
<attribute name="Delay">100</attribute>
</mbean>
再試行ポリシーは設定値を 1 つとります。
- Delay: 失敗したタイマー実行を再試行するまでの遅延時間 (ミリ秒) になります。 デフォルトの遅延時間は 100 ミリ秒です。
EJB タイマーを永続化する必要がない場合、
NoopPersistence ポリシーを使用することができます。この MBean はデフォルトではコメントアウトされていますが、有効にすると次のようになります。
<mbean code="org.jboss.ejb.txtimer.NoopPersistencePolicy"
name="jboss.ejb:service=EJBTimerService,persistencePolicy=noop"/>
タイマーを使用するほとんどのアプリケーションがタイマーの永続化を必要とします。この場合には
DatabasePersitencePolicy MBean を使用してください。
<mbean code="org.jboss.ejb.txtimer.DatabasePersistencePolicy"
name="jboss.ejb:service=EJBTimerService,persistencePolicy=database">
<!-- DataSource JNDI name -->
<depends optional-attribute-name="DataSource">jboss.jca:service=DataSourceBinding,name=DefaultDS</depends>
<!-- The plugin that handles database persistence -->
<attribute name="DatabasePersistencePlugin">org.jboss.ejb.txtimer.GeneralPurposeDatabasePersistencePlugin</attribute>
</mbean>
- DataSource: タイマーデータの書き込み先となる DataSource の MBean です。
- DatabasePersistencePlugin: 永続方法を実装するクラスの名前になります。これは
org.jboss.ejb.txtimer.GeneralPurposeDatabasePersistencePluginになるはずです。