3

私は次のように宣言された単純なBeanを持っています

 @Local(LocalInt.class)
 @Remote(RemoteInt.class)
 @Stateless(name="name")
 public MyEJB_Implementation {
    //methods
 }

ご覧のとおり、これはローカルインターフェイス(ローカルクライアント用)とリモートインターフェイス(リモートクライアント用)を持つ単一のBeanです。

クライアント(リモートおよびローカル)は、次のようにインスタンスを取得します。

ctx = new InitialContext(environment);
ctx.lookup("name");

LocalIntコンテナは、インターフェイスを実装するプロキシを配信するか、インターフェイスを実装するプロキシを配信するかをどのように決定しRemoteIntますか?(ルックアップにまったく同じ「名前」を使用しているため)。

つまり、JNDIレジストリは、ルックアップが同じJVMで実行されるのか、リモートサーバーから実行されるのかをどういうわけか知っていますか?

また、この区別(ローカル呼び出しとリモート呼び出しの場合)は、「ルックアップ」のセマンティクスと衝突しませんか?(1つの名前に対して正確にゼロまたは1つのオブジェクトが登録されている必要があります。この場合、同じ名前で2つのオブジェクト(ローカルとリモート)があるようです)。

ありがとうございました。

4

4 に答える 4

3

私の経験ではlocal、クライアントが同じコンテナー (EAR または WAR) 内にある場合、コンテナーはインターフェースを返し、その外側にある場合はremoteインターフェースを返します。

Java EE仕様で要件として述べられているかどうかはわかりませんが、ほぼすべての標準コンテナがこのように動作します(これも私の経験では)

于 2013-02-19T20:41:20.337 に答える
1

EJB コンテナは、ローカル インターフェイスとリモート インターフェイスを個別の JNDI 名にバインドするため、どちらを検索するかによって異なります。たとえば、EJB 3.1 では、標準のバインディングの場所は次のようになります。

java:app/YourEJBModule/YourEJBName!com.your.pkg.LocalInt
java:app/YourEJBModule/YourEJBName!com.your.pkg.RemoteInt
于 2013-02-20T06:38:59.570 に答える
0

セクション 3 の EJB 3.1 仕様では、ローカル ビューとリモート ビューについて明確に説明されています。セクション3.3.2では、

セッション Bean には、ローカル クライアントがある場合があります。ローカル クライアントは、ローカル クライアント ビューを提供するセッション Bean と同じ JVM に配置され、Bean に密結合されている可能性があるクライアントです。セッション Bean のローカル クライアントは、別のエンタープライズ Bean または Web コンポーネントの場合があります。ローカル クライアント ビューを介してエンタープライズ Bean にアクセスするには、ローカル クライアントと、ローカル クライアント ビューを提供するエンタープライズ Bean の両方が同じ JVM に配置されている必要があります。したがって、ローカル クライアント ビューは、リモート クライアント ビューによって提供される場所の透過性を提供しません。ローカル クライアント ビューを介したエンタープライズ Bean へのアクセスは、ローカル クライアント ビューを提供するエンタープライズ Bean と同じアプリケーション内にパッケージ化されたローカル クライアントに対してのみサポートされる必要があります。

それは動作を説明するはずです

于 2013-02-21T12:03:34.453 に答える
0

Jndi は非常に文脈依存的です。絶対名を使用していると思われる場合でも、それらは多くの場合、検索元の現在のコンポーネントに対して相対的です。

「名前」が機能することに驚いています。これは、実際には別の名前空間 (非 JNDI) を対象としています。

于 2013-02-21T09:35:41.153 に答える