2009-07-10 11 views
3

私はJBoss上でEJB3を実験しており、ステートレスBeanを開発しています。基本的に、モジュールがデプロイされたら、アプリケーション設定のロードに関連するいくつかのアクションを実行する必要があります。 これを行うには@PostConstructというメソッドに注釈を付けました.APIからわかる限り、Beanがデプロイされてサービスに入る前に、そのメソッドを呼び出すように指示しています。 (正しい?) 私は混乱しています。なぜなら、そのメソッドのログからは、単にデプロイされた後ではなく、公開された各メソッドが呼び出される前に呼び出されるからです。 私はそのメソッドを1回呼び出すだけで、呼び出しを受け取るたびに呼び出す必要はありません。最善のアプローチは何でしょうか?ステートレス - 事前java ejb3 @PostConstruct

アレッサンドロIlardo

+0

私はTimがポイントを持っていると思います。コンテナは同じEJBインスタンスで毎回PostConstructアノテーション付きメソッドを呼び出すのではありませんが、受け取った各呼び出しに対して新しいEJBインスタンスを実際にインスタンス化しています。 – AleIla

+0

JBossのコミュニティバージョン(5.1 ASなど)を使用している場合は、http://www.jbossの最新のEJB3プラグインをインストールして、最新のEJB3コードを使用するようにアップグレードしてください。 org/ejb3。 JBossのバージョンで有料になっているのですが、コミュニティでは手動でアップグレードする必要があります。 –

答えて

2

おかげでステートレスBeanはまさにそれでなければなりません。使用中に、Beanがプールから引き出されたか、要求に応じて構築されたかどうかを伝えるか、気にするべきではないということを意味します。 PostConstructがステートレス環境にどのように適用できるかを想像するのは難しいです。なぜなら、私はいつもその関数を使ってBeanの状態を完成させるからです。

JBossは、ステートレスBeanのプーリングを控え、毎回新鮮なものを構築しているか、プーリングを使用している場合は毎回再構成されたように扱います(ステート情報は保持しないでください)。私は実際にPostConstructを呼び出すのは少し驚いています。

+14

ステートレスは「会話なし」を意味し、全く状態を意味しません。それらは内部にコラボレーター・オブジェクトを持っていることがほとんどですが、@PostConstructを使用してそれらを初期化できます。 – skaffman

0

EJBのライフサイクルを管理するのはアプリケーションサーバーに任されています。豆は、豆が収まるといつでも構築、初期化、破棄することができます。あなたのステートレスBeanへの各呼び出しは、あなたのBeanクラスの新しいインスタンス上にあるかもしれませんが、それはやるべきことのように思われます。

アプリケーションサーバーは、@PostConstructメソッドを同じオブジェクトインスタンス上で複数回呼び出すか、毎回異なるインスタンスで呼び出すのですか?コンストラクタと@PostConstructメソッドの内部にログステートメントを貼り付けてみてください。

0

あなたのプールにはいくつのSLSBがありますか?コンテナによっては、最初のクライアントがそれにアクセスするまで(JBossについてはわからない)、@PostConstructは呼び出されないことがあります。そのため、すべてのアクセスのように見えるかもしれません。プールサイズに等しい回数だけメソッドを呼び出すと、ポストコンストラクションメソッドの呼び出しが停止したかどうかを確認することは面白いでしょう。

ポストコンストラクトメソッドで高価なアクションを実行する場合は、起動時にSFSBでこれを行い、ポストコンストラクトのSLSBにSFSBを「注入」してください。

1

まず、最初のメソッドがBeanで呼び出される前に、まずPostConstructが呼び出されます。メソッドが呼び出されない場合、ポストコンストラクトは呼び出されません。

第2に、PreDestoryメソッドで逆アクションを実行して副作用を削除できます。

いずれにしても、実行する必要のあるアクションはありますか?

+0

アクションは単なる1つであり、XMLファイルをアンマーシャリングするクラスを呼び出します。誰かが@Resourceを代わりに使用するように提案しましたが、このコードをSFSBに移動するのかどうかは明確ではありません。 – AleIla

+0

@Mykola Golubyev:回答のステートレスはStateless Beanにのみ適用されます。ステートフルSession Beanは、クライアントがJNDIルックアップまたはDependency Injectionを使用して参照を取得するとインスタンス化され、この時点でPostConstructメソッドが呼び出されます。 – arjacsoh

+0

Wildfly 8.1では、@ステートレスEJBの@PostConstructは、メソッドが呼び出されたかどうかに関係なく、アプリケーションの起動時に明示的に呼び出されます。さらに、それはどのサービスメソッドの実行前でも呼び出されています(私はそれを防ぐ方法はまだ分かりません)。 – cslotty

0

PostConstructは、クライアントがbizメソッドを実行する前に呼び出されます。つまり、Beanがプールされていない場合、コンテナはBeanをインスタンス化し、注入を行い、@ PostConstructメソッドを呼び出し、次にbizメソッドを実行できるようになります。

プールされたBeの場合、Beanがプールから取得されるたびに@PostConstructメソッドが実行されます。ステートレスBeanでは、これはすべてのメソッド呼び出しの間になります。ステートフルBeanの場合、これはクライアントのルックアップまたはインジェクションの後になります。

アプリケーションのデプロイ時に何かを実行する必要がある場合は、使用しているJava EEのバージョンによってオプションが異なります。

Java EE 6では、@ PostConstructメソッドを含む@Singleton EJBで@Startupを使用できます。

Java EE 5以前では、WebアーカイブでServletContextListenerを使用する必要があります。必要に応じてServletContextListenerにEJBを呼び出させることができます。

さらに重要な質問は、これらのアプリケーション設定をどこにロードするかです。クラスタ化されていない単一のJVM構成を扱っている場合は、おそらくそれらをある種のシングルトンにロードしたいと思うでしょう。 Java EE 5では、シングルトンデザインパターンを自分で実装するか、EE 6では@ Singleton EJBタイプを使用する必要があります。