私の同僚は、ローカル EJB を使用するのは得策ではないと言っていました。
私はそれに強く反対します。ローカル EJBは、ビジネス ロジックを実装するのに最適なタイプの Bean であるため、非常に優れたアイデアです。現在の EJB Bean の作物は非常に軽量であるため、重量が重いという理由でそれらを避ける必要はありません。
これらのタイプの Bean の最大の利点は、おそらく自動トランザクション管理であり、あらゆる種類のデータベース作業を行う際に非常に役立ちます。
JMS キューや複雑な EIS システムにアクセスする必要があるのは、エンタープライズ アプリケーションだけではありません。一度に複数のデータベースへの書き込みを行う Web アプリケーションは、このことから大きな恩恵を受けます。トランザクションがなけれUser
ば、例外やクラッシュが発生するたびに、データベースに半分しか保持されないということになります。また、EJB を使用しないと、大量の非常に冗長なステートメントでコードを散らかさなければならずstart\commit\rollback
、トランザクションを (通常は「接続」を介して) すべてのコードに伝播し、トランザクションがアクティブである場合とアクティブでない場合とで別々のケースを持つことは言うまでもありません。
EJB Bean を使用すると、その複雑さがすべて解消されます。ガベージ コレクションと手動のメモリ管理のようなものです。
@RolesAllowed
宣言型ロール チェック ( )、Bean のプーリング (特にスループットを調整するため)、スレッド セーフなど、最も単純な Web アプリケーションでも利用できる興味深い機能が他にもたくさんあります。
Java EE 6 では単純な Web アプリケーションで使いやすくなり、.war のどこにでも表示できます (別の .jar と傘の .ear はもう必要ありません)。
だから私は混乱しています: GWT サーブレット (単純な HTTP サーブレットよりも便利で、RPC スタイルのメソッド呼び出しを提供します) をいつ使用し、いつ EJB を使用するのですか?
ここで、リモート EJBについて説明します。この場合、答えは異なります。
クライアントがインターネットから接続している場合、リモート EJB を使用することはほとんどありません。クライアントのポートを含め、通常、開く必要があるポートは多数あります。
同様に、異種クライアント (.NET、C++、さらにはリモート EJB が使用する AS のわずかに異なるバージョンを実行している Java クライアント) がある場合、通常はリモート EJB を使用しません。
理論的には Corba (IIOP) をサポートしているため、さまざまなタイプのクライアントを使用できますが、実際にはリモート EJB 通信は、クライアントとサーバーの両方が Java を実行していて、同じ AS (アプリケーション サーバー) を除いて同じであるか、それらの 1 つが Java SE クライアントである場合にのみ機能します。リモート サーバーのクライアント ライブラリ (巨大になる可能性があります)。
リモーティング テクノロジとしては少し厄介ですが、EJB 仕様ではそもそもリモート接続の設定方法さえ指定されていません。事実上の標準はリモート JNDI ですが、これは仕様ではないため、JBoss はたとえば JBoss AS 7 でのサポートを停止したいと考えていました。
いずれの場合も、Web Service
リモート EJB の代わりにテクノロジを使用します。GWT Servlet
オプションかもしれませんが、ここでは実際には正規の例ではありません。すでに GWT を使用している場合を除き、任意の (非 GWT) クライアントからの一般的な web/rpc 接続のためだけにインストールすることはお勧めしません。
一般的な Java ソリューションは、SOAP resp REST 実装である JAX-WS と JAX-RS です (どちらも EJB と組み合わせることができます)。よく知られている JAX-RS 実装は、Jersey (例) とRestEasyです。Java EE 6 では、それらは既にプラットフォームの一部であるため、何もインストールする必要はありません。Java EE 5 の場合、JAX-RS を個別にインストールする必要がありますが、JAX-WS は既にインストールされています。
一般的に、JAX-RS の方が使い始めやすく、最新のアプローチであることがわかりますが、JAX-WS にはより多くの型安全機能が組み込まれています (複雑さのほとんどの原因はまさにそこにあります)。
最後に、いつリモート EJB を使用するのでしょうか? 通常、これは、同じ AS を実行しているローカル ネットワーク上のアプリケーション間の通信に対して行います。その場合、潜在的なパフォーマンス上の利点があり (バイナリ シリアライゼーションは json/xml 変換より高速である可能性があります)、セキュリティ コンテキストを伝播し、分散トランザクションを調整するためのいくつかの強力なオプションがあります。単純な Web アプリでは、最後の機能はほとんど必要ありません。
よく見られるパターンは、リモート (Web) クライアントからの要求を受け入れ、実際のビジネス ロジックを含むローカル EJB に作業を委譲する JAX-RS リソース (Bean) のパターンです。