最近、EJB3.1 について多くのことを学びましたが、十分ではないようです。これが私の悲惨な物語です...
バッチファイルをアップロードできるサーブレットとの戦いがあります。サーブレットはファイルを検証し、ファイル データをデータベースに保存し、新しいバッチが受信されたことを示すメッセージをキューに送信します。これはすべてうまくいきます。
私は、新しいバッチ受信メッセージをリッスンする MDB を持つ ejb-jar を展開した耳を持っています。
また、実際のバッチ処理を行うステートフル EJB (非インターフェース ビューを使用) も備えています。EJB にはステートレス JPA エンティティ サービス Bean への参照があるため、コンテナに注入された EntityManagers を取得するには、コンテナ管理が必要です。
MDB がメッセージを受信するたびに、ステートフル プロセッサ Bean のインスタンスを作成する必要があります。このシナリオをカバーする例/チュートリアルを見つけることができませんでした。
ステートフル Bean を MDB に注入しようとしましたが、うまくいきません。
[#|2011-11-24T13:25:45.470-0700|SEVERE|glassfish3.1.1|javax.enterprise.system.container.ejb.mdb.com.sun.ejb.containers|_ThreadID=21;_ThreadName=Thread-2;|MDB00050: Message-driven bean [MyProcessor-ear-1.0:MyMDB]: Exception in creating message-driven ejb : [com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=my.package.MyMDB/myEJB,Remote 3.x interface =my.package.MyEJB,ejb-link=null,lookup=,mappedName=,jndi-name=my.package.MyEJB,refType=Session into class my.package.MyMDB: Lookup failed for 'java:comp/env/my.package.MyMDB/myEJB' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}]|#]
MDB は本質的にステートレスであるため、ステートフルな EJB を注入するべきではないため、これはどう見ても悪い設計アプローチです。意味あり。
私の質問は、MDB がメッセージを受信したときにステートフル EJB をインスタンス化し、EJB がコンテナー管理されていることを確認するにはどうすればよいかということです。