両方の動作を確認したので、EJB と WebServices という 2 つのテクノロジを比較できます。EJB の方がはるかに効率的で、トランザクション (必要に応じて分散トランザクションを含む)、例外処理、バイナリ ストリーミングをサポートしていることを確認できます。パフォーマンスに関しては、EJB は速度で SOAP を 5 倍、REST を約 3 倍上回る可能性があります。
ただし、EJB は統合テクノロジではありません。実際、そうするつもりはありませんでした。EJB の最大の欠点は、Java プラットフォームと非常に結合していることです。したがって、両方のエンドポイントを Java で記述し、同じ Java EE バージョンを使用する必要があります。
もう 1 つの問題は、EJB 自体がプロトコルではないため、2 つのコンテナー/ベンダーからの実装がおそらく異なることです。Oracle WebLogic サーバー上の JBoss AS からリモート EJB にアクセスする必要がある場合は、JBoss EJB クライアント実装を持参する必要があります。
EJB との統合に関連するもう 1 つの大きな問題は、データ交換フォーマットの欠如です。通信には Java Serialized オブジェクトを使用するため、データ型は両端で共有する必要があります。アプリケーション例外として分類される新しい例外タイプをサーバー上に作成する場合、このサービスを使用するクライアントが例外をトリガーすると、そのクライアントのコードが壊れます。この場合、リモート API には違反していませんが、別の不明なタイプが導入されていることに注意してください。
そしてもちろん、交換フォーマットとしてクラス型だけに依存することで、プログラマーに非常にばかげたことをする機会を与えています。さまざまなバージョンの Java EE を使用する統合テクノロジとして EJB を使用する大規模なプロジェクトで、さまざまなチームが多数いる場合は、最大の苦痛を経験する準備をしてください。名前付きクエリ、アクセスしているテーブル、その列などで注釈が付けられたクライアント上の JPA エンティティを含むプログラマーのように見え、基本的にすべてのデータベース レイアウトをサービス コンシューマーに提供します。しかし、さらに悪化する可能性があります。私はすでに、Eclipselink 1.0 という依存関係に属するデータ構造を返すプログラマーのように見えます。ただし、JBoss サーバーからこれにアクセスする場合、Eclipselink も JPA 実装テクノロジであり、JBoss の休止状態と競合します。そう、ここで、JBoss APP クラスパスに Eclipselink jar を含め、JPA 関連パッケージをロードしないようにコンテナーを構成する必要があります。そうしないと、アプリケーションが完全に壊れてしまいます。それでも、以前よりも悪化する可能性があります。接続する必要がある他のサービスにも、同じデータ構造を使用するという優れたアイデアがありましたが、Eclipselink 1.1.1 からは実装が異なりますが、クラス署名は同じです。今、あなたは非常に悪い状況にあります。しかし、同じクラス署名。今、あなたは非常に悪い状況にあります。しかし、同じクラス署名。今、あなたは非常に悪い状況にあります。
結論: EJB を統合テクノロジとして使用することは決してありません。コントラクト ファースト アプローチを使用して SOAP を使用します。このアプローチでは、アプリケーションの正規データ モデルを定義し、Java データ構造を、任意の言語で記述されているか、異なるスタックを使用しているかに関係なく、任意のクライアントが使用できる XML 交換フォーマットにマッピングします。または、HATEOAS 原則を使用して、リソース ベースを実装する REST を使用します。最近では、EJB を使用する理由はほとんどないように思えます。CDI は現在市場に出ており、EJB がサポートする多くの機能をサポートしており、RPC 関連のテクノロジは含まれていません。