メッセージ駆動型 Bean は、J2EE アプリケーションがメッセージを非同期に処理できるようにするエンタープライズ Bean です。Bean は Java Message Service (JMS) のメッセージリスナーとして機能します。イベントリスナーに似ていますが、メッセージ駆動型 Bean はイベントではなくメッセージを受信します。メッセージは、アプリケーションクライアント、別のエンタープライズ Bean、Web コンポーネントなど、任意の J2EE コンポーネントから送信できます。
メッセージ駆動型 Beans は、メッセージが入ってきたときに処理が起動する、非同期のエンタープライズアプリケーションを構築するソリューションです。このアプローチでは、エンタープライズアプリケーションモジュール間で疎結合が可能になります。送信側 (プロデューサ) がメッセージを JMS 管理によるオブジェクト (トピックまたはキュー) に送信し、プロセスを開始します。
セッション Beans およびエンティティー Beans とは異なり、メッセージ駆動型 Beans のクライアントは Beans に直接アクセスしません。メッセージ駆動型 Bean には、Bean クラスだけがあります。
いくつかの観点で、メッセージ駆動型 Bean はステートレスセッション Bean に似ています。
メッセージ駆動型 Bean のインスタンスのインスタンス変数は、クライアントメッセージを処理する間、エンタープライズ Bean オブジェクトへのオブジェクト参照など、いくつかの状態情報を維持できます。
メッセージを受信すると、コンテナはメッセージ駆動型 Bean の onMessage メソッドを呼び出し、メッセージを処理します。onMessage メソッドは、通常、メッセージを 5 つの JMS メッセージ型のいずれかにキャストし、アプリケーションのビジネスロジックに従ってメッセージを処理します。onMessage メソッドは、ヘルパーメソッドを呼び出したり、セッション Bean またはエンティティー Bean を起動してメッセージの情報を処理し、結果をデータベースに保存することがあります。
メッセージ駆動型 Bean クラスの多くのインスタンスを同時に実行できるため、メッセージのストリームを同時に処理できます。メッセージがこれらのインスタンスに配信される正確な順序は保証されないため、順序に従わないメッセージを処理するように、メッセージ駆動型 Bean を準備する必要があります。たとえば、予約を取り消すメッセージが予約をするメッセージよりも前に配信されることがあります。
コンテナは、メッセージ駆動型 Bean のインスタンスに、コンテナが管理するコンテキストに Bean インスタンスがアクセスできるようにする MessageDrivenContext を提供します。Bean が独自にトランザクションを管理するか、コンテナのトランザクション管理に依存するかに応じて、Bean は MessageDrivenContext の異なるメソッドにアクセスし、トランザクションを処理します。
Bean がこの インタフェースを使用してトランザクション境界を定める場合、Bean の呼び出しを引き起こすメッセージ受信は、トランザクションの一部ではなくなります。メッセージ受信をトランザクションの一部にするには、コンテナ管理によるトランザクションを使用する必要があります。
メッセージ駆動型 Bean の newInstance、setMessageDrivenContext、ejbCreate 、および ejbRemove メソッドは、不特定のトランザクションコンテキストで呼び出されます。トランザクションコンテキストは JMS メッセージに付随しないため、メッセージ駆動型 Bean が呼び出されたときに使用できるクライアントトランザクションコンテキストはありません。
Bean は、次の MessageDrivenContext メソッドを使用できます。