2

私は EJB が初めてで、最初の問題に直面しています。ステートレス EJB に含まれる @Schedule メソッドを使用しようとしています。このメソッドで、Bean の作成時に設定されるプライベート メンバー変数を使用したいと思います。

以下に短い例を示します。

@Singleton
@LocalBean
@Startup
public class Starter {

     @PostActivate
     private void postActivate() {

         ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");

     }

}

そして、スケジュール Bean:

@Stateless
@LocalBean
public class ScheduleEJB {

     private String message;

     public ScheduleEJB() {
         super();
     }

     public ScheduleEJB(String message) {
         super();
         this.message= message;
     }

     @Schedule(second="*/3", minute="*", hour="*", dayOfMonth="*", dayOfWeek="*", month="*", year="*")
     private void printMsg() {

         System.out.println("MESSAGE : " + message);
     }
 }

問題は、「メッセージ」変数が printMsg() メソッドで出力されると常に null になることです...これを達成する最善の方法は何ですか?

ご協力いただきありがとうございます !

4

1 に答える 1

10

あなたはここでいくつかのものを混ぜています。

  1. @PostActivateアノテーションはステートフル セッション Bean (SFSB) で使用され、シングルトンで使用されます。コンテナによってライフサイクルが管理されるすべての Bean に適用される@PostConstructメソッドを意味していると思います。

  2. EJB のコンストラクターを使用しています。あなたはできません

    ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
    

    このクラスのインスタンスを作成するだけです。これは EJB ではありません。コンテナーが作成したのではないため、このクラスにはまだ EJB の性質がありません。それが依存性注入の要点です。必要なものを定義するだけで、コンテナはリソースの適切なインスタンスを提供する責任があります。

  3. ステートレス Bean (SLSB) は、状態を保持するためのものではありません。SFSB です。1 つの SLSB メソッド (つまり、いくつかの ScheduleEJB#setMessage(String) メソッド) でメッセージを設定する場合でも、EJB がプールされていることを覚えておく必要があります。次に ScheduleEJB でメソッドを呼び出したときに、同じインスタンスに到達するという保証はありません。

あなたの場合、 @Schedule メソッドをシングルトンクラスに追加するだけで簡単に解決できます。@PostConstruct メソッドで選択した変数を定義できます。JVM ごとに Singleton インスタンスが 1 つしかないことを確認できるため、変数は同じクラスの Schedule アノテーション付きメソッドで表示されます。

HTH。

于 2011-10-21T14:15:48.690 に答える