メッセージ駆動型 Bean は、J2EE アプリケーションがメッセージを非同期に処理できるようにするエンタープライズ Bean です。Bean は Java Message Service (JMS) のメッセージリスナーとして機能します。イベントリスナーに似ていますが、メッセージ駆動型 Bean はイベントではなくメッセージを受信します。メッセージは、任意の J2EE コンポーネント(アプリケーションクライアント、別のエンタープライズ Bean、または Web コンポーネント) から送信できます。
サーバーリソースの占有を避けるために、セッション Bean またはエンティティー Bean の代わりにメッセージ駆動型 Bean を使用します。セッション Bean およびエンティティー Bean も、JMS メッセージの送受信ができますが、メッセージ駆動型 Bean のように非同期に処理を行うのではなく、同期的に処理を行います。
セッション Bean およびエンティティー Bean とは異なり、メッセージ駆動型 Bean のクライアントは、インタフェースから Bean にアクセスしません。メッセージ駆動型 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 メソッドを使用できます。