10. シングルトンEJBと@Scheduleでデータをプリフェッチしたキャッシング

EJB 3.1の仕様では @Singleton アノテーションが導入され、JVM毎、アプリケーション毎に単一のEJBインスタンスを生成できるようになりました。デフォルトでは全てのメソッドがスレッドセーフでありトランザクション管理されています。この仕様ではカレンダーベースな表現を使用してスケジュール化されたコールバックメソッドも簡単に定義できます。これらのメソッドは特定の時間や、特定の経過時間後、または定期的な間隔で実行可能です。

このセクションでは定期的な間隔でデータベースからデータをプリフェッチするシングルトンなEJBを追加します。

  1. “org.glassfish.samples”パッケージを右クリックして, “New”, “Session Bean...”を選択し、 名前に“CacheSingletonBean”を入力し, 次のように“Singleton”を入力してください。

そしてOKをクリックしてください。

  1. クラスに次のアノテーションを追加します。
@javax.ejb.Startup

これにより、アプリケーションが起動する際ににシングルトンBeanがすぐにロードされます。

  1. 次のコードを生成sれたクラスに追加してください。
@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 の設定値を考慮した方が良いでしょう。

Project Versions

前のトピックへ

9. JPA2のメタモデルを使用しタイプセーフなクライテリアクエリの実行

次のトピックへ

11. JSF2とFaceletsベースなビューを用いたMVC

このページ