EJB 3.1の仕様では @Singleton アノテーションが導入され、JVM毎、アプリケーション毎に単一のEJBインスタンスを生成できるようになりました。デフォルトでは全てのメソッドがスレッドセーフでありトランザクション管理されています。この仕様ではカレンダーベースな表現を使用してスケジュール化されたコールバックメソッドも簡単に定義できます。これらのメソッドは特定の時間や、特定の経過時間後、または定期的な間隔で実行可能です。
このセクションでは定期的な間隔でデータベースからデータをプリフェッチするシングルトンなEJBを追加します。
そしてOKをクリックしてください。
@javax.ejb.Startup
これにより、アプリケーションが起動する際ににシングルトンBeanがすぐにロードされます。
@EJB CustomerSessionBean bean;
List<Customer> customers;
public List<Customer> getCustomers() {
return customers;
}
@Schedule(hour="*", minute="*", second="*/30")
public void preFetchCustomers() {
System.out.println(new Date() + " Fetching customers");
customers = bean.getCustomers();
}
importを修正してください。
このコードは先ほど作成した CustomerSessionBean を使用して顧客リストを取得します。このメドッドは @Schedule アノテーションをもち、cronライクな文法で繰り返しでメソッドを実行する間隔を指定できます。GlassFishサーバーのログには次のようなメッセージが出力されます。
このログメッセージは顧客情報のキャッシュが @Schedule で定義されているように、30秒毎に更新されていることを示します。
アプリケーションはCustomerSessionBeanの代わりにこのシングルトンbeanを使用して次のように顧客リストを取得します。
@EJB CacheSingletonBean bean;
. . .
bean.preFetchCustomers();
タイマーイベントが一回も呼ばれずにnullが返る場合に``bean.getCustomers()`` が実行されてはいけないことに注意してください。
preFetchCustomers メソッドの出力結果でサーバーログが溢れないように @Schedule の設定値を考慮した方が良いでしょう。