第 7 章 JAKARTA CONTEXTS AND DEPENDENCY INJECTION
7.10. オブザーバーメソッド
@Secure
@Transactional
@RequestScoped
@Named
public class AccountManager {
public boolean transfer(Account a, Account b) { ...
} }
@Secure
@Transactional
@RequestScoped
@Named
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface BusinessComponent { ...
}
@BusinessComponent
public class AccountManager {
public boolean transfer(Account a, Account b) { ...
} }
オブザーバーメソッドは、イベント発生時に通知を受け取ります。
また、Contexts and Dependency Injection は、イベントが発生したトランザクションの完了前または完
了後フェーズ中にイベント通知を受け取るトランザクションオブザーバーメソッドを提供します。
7.10.1. イベントの発生と確認 例
例
:イベントの実行 イベントの実行
以下のコードは、メソッドでインジェクトおよび使用されるイベントを示しています。
例
例
:修飾子を使用したイベントの実行 修飾子を使用したイベントの実行
修飾子を使用すると、より具体的にイベントのインジェクションにアノテーションを付けられます。修 飾子の詳細は、「修飾子」を参照してください。
例
例
:イベントの確認 イベントの確認
イベントを確認するには、@Observes アノテーションを使用します。
修飾子を使用すると、特定の種類のイベントのみを確認できます。
7.10.2. トランザクションオブザーバー
public class AccountManager { @Inject Event<Withdrawal> event;
public boolean transfer(Account a, Account b) { ...
event.fire(new Withdrawal(a));
} }
public class AccountManager {
@Inject @Suspicious Event <Withdrawal> event;
public boolean transfer(Account a, Account b) { ...
event.fire(new Withdrawal(a));
} }
public class AccountObserver {
void checkTran(@Observes Withdrawal w) { ...
} }
public class AccountObserver {
void checkTran(@Observes @Suspicious Withdrawal w) { ...
} }
トランザクションオブザーバーは、イベントが発生したトランザクションの完了フェーズ前または完了 フェーズ後にイベント通知を受け取ります。トランザクションオブザーバーは、単一のアトミックトラ ンザクションよりも状態が保持される期間が長いため、トランザクションオブザーバーはステートフル オブジェクトモデルで重要になります。
トラザクションオブザーバーには 5 つの種類があります。
IN_PROGRESS: デフォルトではオブザーバーは即座に呼び出されます。
AFTER_SUCCESS: トランザクションが正常に完了する場合のみ、オブザーバーはトランザク
ションの完了フェーズの後に呼び出されます。
AFTER_FAILURE: トランザクションの完了に失敗する場合のみ、オブザーバーはトランザク
ションの完了フェーズの後に呼び出されます。
AFTER_COMPLETION: オブザーバーはトランザクションの完了フェーズの後に呼び出されま
す。
BEFORE_COMPLETION: オブザーバーはトランザクションの完了フェーズの前に呼び出され
ます。
以下のオブザーバーメソッドは、カテゴリーツリーを更新するトランザクションが正常に実行される場 合のみアプリケーションコンテキストにキャッシュされたクエリー結果セットを更新します。
以下の例のように、Jakarta Persistence クエリーの結果セットをアプリケーションスコープでキャッ シュしたと仮定します。
Product はときどき作成および削除されます。この場合は、製品製品カタログを更新する必要がありま
す。ただし、この更新を実行する前に、トランザクションが正常に完了するのを待つ必要があります。
以下は、イベントを引き起こす Products を作成および削除する bean の例になります。
public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) { ... }
import javax.ejb.Singleton;
import javax.enterprise.inject.Produces;
@ApplicationScoped @Singleton public class Catalog {
@PersistenceContext EntityManager em;
List<Product> products;
@Produces @Catalog List<Product> getCatalog() { if (products==null) {
products = em.createQuery("select p from Product p where p.deleted = false") .getResultList();
}
return products;
} }
import javax.enterprise.event.Event;
@Stateless
トランザクションが正常に完了した後に、Catalog がイベントを監視できるようになりました。