もちろん、あなたの質問に対する最短の答えは、EJBがサーブレットのように機能できるようにすることをお勧めします。EJB3.1では、まさにそれを実行できるコンポーネントを追加しました。@Singleton
Beanは、次の@Singleton
いずれかの方法でサーブレットのようにマルチスレッド化できます。
- 使用する
@ConcurrencyManagement(BEAN)
- 並行性が必要なメソッドやスレッドセーフではないメソッド
@ConcurrencyManagement(CONTAINER)
と一緒に使用します。@Lock(READ)
@Lock(WRITE)
サーブレットがEJBにはなかった何年にもわたって持っていたもう一つのことは、サーブレットが<load-on-startup>
熱心にロードされ、アプリケーションの開始時に機能することを可能にすることでした。
サーブレットと一致させるために、任意のEJBに追加できるアノテーションを<load-on-start>
追加し、アプリケーションの起動時にEJBを起動させます。これらのBeanには、アプリケーションの起動時に呼び出されるメソッドと、アプリケーションのシャットダウン時に呼び出されるメソッドがあります。@Startup
@Singleton
@PostConstruct
@PreDestroy
番号()を使用して、 startで注釈が<load-on-startup>1</load-on-startup>
付けられたBeanの順序を指定するのではなく、Beanに注釈を付け、注釈付きBeanの前に開始する必要があるBeanのリストを指定できます。@Startup
@DependsOn
そして、サーブレットとEJBを整列させるためにEJB 3.1で行った、あまり知られていない、理解されていない側面は、もちろん、EJBを.war
ファイル内にパッケージ化できるようにすることでした(これはあまり知られていない部分ではありません)。java:comp/env
サーブレットアプローチに一致するように。
java:comp/env
EJB 3.1より前は、2つのEJBで名前空間を共有する方法はありませんでした( java:comp/env
EJB仕様ではBeanスコープです)。対照的に、サーブレットには、個々のサーブレットが独自のプライベートjava:comp/env
名前空間を持つ方法がありませんでした(java:comp/env
サーブレット仕様ではモジュールスコープです)。したがって、EJB 3.1では、戦争にパックされたEJBは、Webアプリケーション内の他のすべてのサーブレットおよびEJBと同じモジュールスコープの名前空間を持ちます。これは、 EJBがEARにパックされたときに取得するjava:comp/env
Beanスコープの名前空間とはかなり対照的です。java:comp/env
戦争の外。私たちはそれについて何週間も議論しました。
お友達にクイズをするのにちょっとしたビールタイムはささいなことです。