0

最近、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 がコンテナー管理されていることを確認するにはどうすればよいかということです。

4

3 に答える 3

0

javax.jms.QueueBrowserを使用して、キュー内のメッセージの状態を検査できます。また、セレクターとプロパティメッセージを使用して、具体的なバッチプロセスを見つけることができます。

于 2011-12-10T11:11:41.353 に答える
0

上記で指摘したように、バッチとは無関係にバッチ処理の単一の状態 (実行中、一時停止中、キャンセル済み) を維持する必要がある場合、つまり、特定の瞬間に消費するすべての MDB に状態が適用される場合: EJB を@Singleton? このようにして、EJB のインスタンス変数にその状態を保持し、それから MDB を読み取ることができます。

于 2011-11-25T14:16:51.897 に答える
0

MDB の onMessage メソッドが処理を行うように、クラスを再設計してマージしました。個々のバッチの状態は、MDB の静的マップに格納されています。

于 2011-12-01T18:21:50.393 に答える