0

EJB 仕様によると、非 final 静的フィールドは許可されていません。これはシングルトンとして定義された EJB 3.1 ステートレス セッション Bean にも当てはまりますか?

物事を明確にし、なぜそれをやりたいのかという質問を避けるために:

サーバーの起動時にEJBが作業を開始し、DB関連の作業を行う必要がある状況があり、それが完了したときにのみ、システム内の他のすべてのコンポーネントに作業を開始できることを通知します。

この EJB はタイマーでも定義されるため、数分ごとに開始されるため、最初に失敗した場合は、成功するまで、または誰かが問題に気付くまで再試行します。成功すると、フラグが変更され、他のすべてのコンポーネント (タイマー EJB) が起動できるようになります。

したがって、Singleton EJB があり、他のすべてのコンポーネント/EJB が参照できる静的 (グローバル) フラグを保持する必要があります。

4

2 に答える 2

1

アプリケーションをクラスタ化しようとするとすぐに問題が発生するため、non-final 静的フィールドは依然として禁止されています。EJB シングルトンは、それが実行されているサーバー インスタンス上のシングルトンのみです。2 つのサーバー インスタンスがある場合、静的フィールドに異なる値を持つシングルトンの 2 つのバージョンを含めることができます。

グローバル フラグが必要な場合は、データベースに格納することをお勧めします。

于 2012-05-21T10:58:33.457 に答える
0

クラスは、単一の EJB 定義を持つ 1 対多であることに注意してください。言い換えると:

<session>
  <ejb-name>TestA</ejb-name>
  <ejb-class>org.example.SingletonBean</ejb-class>
</session>
<session>
  <ejb-name>TestB</ejb-name>
  <ejb-class>org.example.SingletonBean</ejb-class>
</session>

SingletonBeanこの例では、クラスのインスタンスが複数あり、1 つはTestAEJB 用、もう1 つは EJB 用TestBです。この使用例と、EJB プログラミング モデルが (良くも悪くも) プログラマーを保護しようとする傾向があることを考えると、静的フィールドに対する制限を維持することは妥当と思われます。

コンテナーがシングルトン EJB の単一インスタンスを管理していることを考えると、グローバル状態をインスタンス変数としてシングルトンに格納することもできます。シングルトンを他の Bean に注入すると、それらはすべて、メンバー変数を介して共有状態にアクセスできます。とにかく、それがシングルトン EJB のポイントです。

于 2012-05-21T21:36:46.280 に答える