EJB3.1入門 〜EJBは三種類〜
ステートレス・セッションBean は、クライアントごとに内部状態を保持しないインスタンスがEJBコンテナから提供される。
ステートフル・セッションBeanは、クライアントごとに内部状態を保持できるインスタンスがEJBコンテナから提供される。
シングルトン・セッションBeanは、全てのクライアントに共通のインスタンスがEJBコンテナから提供される。シングルトン・セッションBeanは内部状態を保持できる。
EJB3.1の各メソッドの同時アクセス管理はEJBコンテナが行う。そのためsynchronizedやvolatile等を使った同期管理は不要。
// ステートレス・セッションBeanの指定 @Stateless public class BussinessLogicStateless { // JPA2.0のEntityManagerを注入する。 @PersistenceContext(unitName="databaseUnit") private EntityManager em; //EJB内でEJBを注入する。 @EJB private OtherEJB otherEjb; // ejb-jar.xmlで指定されたパラメータを注入する @Resource(name = "currencyEntry") private String currency; // JAX-WSによるWebサービスを注入する @WebService(name="service", serviceName="WebServiceSpecial", targetNamespace="http://special.org") private SpecialWebService special; // 非同期呼び出しの指定。クラスに付加すると全てのメソッドが非同期呼び出しになる。 // java.util.Futureクラスは非同期処理の結果を受け取るクラス @Asynchronus public Future<Integer> sendOrderToWorkFlow(){ //非同期処理を行う。 return new AsyncResult<Integer>(status); } //Timerサービスを使うときには必須。 @Resource TimerService timerService; public void createCustomer(){ //timerServiceを使ってタイマを設定する。 timerService.createCalendatTimer(birthDay, new TimerConfig(customer, true)); } @Timeout public void sendBirthdayEmail(Timer timer){ // timer内の情報を使ってメールを送信。 Customer customer = (Customer)timer.getInfo(); } }
//ステートフル・セッションBeanの指定 @Stateful // このBeanのインスタンスが削除されるまでのアイドル時間。 // 指定された時間が経つと@Removeアノテーションが付加されたメソッドが実行され、 // インスタンスがメモリから削除される。 @StatefulTimeout(value = 20, unit = TimeUnit.SECONDS) public class BusinessLogcStateFul{ // インスタンスが削除される時に実行されるメソッド @Remove public void checkout() { cartItems.clear(); } }
// このBeanよりも先に初期化したいシングルトンBeanを指定する。 @DependsOn("BeforeSingletonEjb","InitialCacheEjb") // アプリの起動時に、このシングルトンBeanを初期化する指定。 // この指定が無ければ最初の呼び出し時に初期化される。 @Startup // シングルトン・セッションBeanの指定。 // このBeanのインスタンスはアプリケーションに一つのみ存在するようにEJBコンテナに管理される。 @Singleton // 全てのメソッドを共有ロック方式で各メソッドの同時呼び出しを許可する。 // @Lockが付加されていないデフォルトではLockType.WRITEで、同時呼び出しは不可。 @Lock(LockType.READ) public class CacheEJB { // このメソッドは排他ロック方式でロックし、同時呼び出しを許可しない。 // クラスに付けられた@Lockアノテーションを上書きしている。 @Lock(LockType.WRITE) // 同時アクセスのタイムアウト指定。 // 指定時間が過ぎても排他ロックが解除されない場合はConcurrentAccessTimeoutExceptionが投げられる。 @AccessTimeout(value=20, unit=TimeUnit.SECONDS) public String getCacheValue(){ } }
- 使わないアノテーション
// 同時実行の管理を自前で行う場合に使用。
// 同時実行の管理はEJBコンテナ管理に任せておけばよいし、それがデフォルト。
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)