1

私はJBossAS7とEJBステートレスでScheduleメソッドを使用しています。私の問題は、EJBでさえステートレスであり、その状態を維持していることです。これにより、問題が発生します。次に例を示します。

タイマー:

@Stateless
public class TestTimer {

    @Inject HelloWorldService helloWorld;

    @SuppressWarnings("unused")
    @Schedule(second="*/10", minute="*", hour="*", info="MyTimer")
    private void execute() {
        System.out.println(helloWorld.sayHello());
        System.out.println(this.toString() + " "+ helloWorld.toString());
    }
}

注入されたHelloWorldService:

public class HelloWorldService {

    public String sayHello() {
        return "Hello World!";
    }
}

System.out.println(this.toString() + " "+ helloWorld.toString());毎回新しいインスタンスになるので、タイマーが実行されるたびに行が1回異なる時刻を出力することを期待していましたTestTimerが、私は間違っていました。

16:43:50,003 INFO  [stdout] (EJB default - 3) foo.service.TestTimer@4a56936f foo.service.HelloWorldService@79e98289
16:44:40,022 INFO  [stdout] (EJB default - 1) foo.service.TestTimer@4a56936f foo.service.HelloWorldService@79e98289

私は何か間違ったことをしていますか、これは予想される動作ですか、それとも何ですか?

4

5 に答える 5

2

EJB仕様では、ステートレスBeanが各呼び出しの後に状態を破棄することは規定されていません。アプリケーション開発者は、Beanがその状態を維持することに依存してはならないと述べています。微妙ですが、非常に重要な違いがあります。同じBeanインスタンスを複数回使用できます。これはステートレス性を否定するものではありません。

于 2012-10-29T18:51:19.197 に答える
2

重要なのは、ルックアップがあるタイマーごとに、Beanの異なるインスタンスを取得できることですが、「may」は 、コンテナーが管理する
Beanのプールから取得されるため、同じインスタンスを取得できることを意味します。 適切な機能を提供する限り 、同じタイマーオブジェクトを使用しても問題はありません。 これは、開発者として、Beanの状態、およびBeanの新しいルックアップ時に復元されるかどうかを推測できないことを意味します。




于 2012-10-29T18:53:03.377 に答える
1

ステートレスBeanは、必要な回数だけ使用できます。それらは毎回作成される必要はありません。EJBのライフサイクルはhttp://docs.oracle.com/javaee/6/tutorial/doc/giplj.htmlで確認できます。

于 2012-10-29T18:51:28.533 に答える
1

これは(Java EE仕様による)予想される動作であり、実際にはそれよりも少し複雑です。

アプリサーバーは、stalessセッションBeanのプールを管理し、クライアント要求をサーバー化するためにこのプールのインスタンスを使用しています。サーバーに負荷がかかっている場合は、プールから複数のBeanが使用され、それぞれに独自の状態があります。したがって、テストでは、同じ文字列値が出力されることもあれば、別の文字列値が出力されることもあります。

ビジネスロジックにプロパティを使用しないでください。ただし、技術的な目的(DBへの参照を保持するなど)でプロパティを使用することをお勧めする場合があります。

于 2012-10-29T18:52:27.833 に答える
1

コンテナには、ステートレスセッションBeanのプールがあります。アクティブなインスタンスの数を処理するのはコンテナの内部です(私が知る限り)あなたの場合、同じインスタンスがタイマーによって呼び出されているようです。

于 2012-10-29T18:52:29.423 に答える