2011-10-21 28 views
2

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

ここでは簡単な例です:

@Singleton 
@LocalBean 
@Startup 
public class Starter { 

    @PostActivate 
    private void postActivate() { 

     ScheduleEJB scheduleEjb = new ScheduleEJB("Hello"); 

    } 

} 

とスケジュール豆:

@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()メソッドで印刷すると、私の "message"変数が常にヌルであるということです。これを達成する最良の方法は何ですか?

ありがとうございました!

+0

2つのクラスの代わりに単一のシングルトンEJBを使用しない理由を説明できますか? PostConstructメソッドで変数を初期化し、同じシングルトンクラスでスケジューラを定義することができます。 – perissf

答えて

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ごとに1つのシングルトンインスタンスしか存在しないことを確認することができます。そのため、変数は同じクラスのScheduleアノテーション付きメソッドに表示されます。

HTH。

+1

@ user1006840あなたの問題を解決しましたか? –

+1

すてきな回答@PiotrNowicki .. – Kurohige