1

リモート インターフェイスを持つ EJB Bean があります。war ファイルの chapter08-service-1.0 に含まれています。

@Remote
public interface BookEJBRemote {
    ...
}

グラスフィッシュにデプロイした後、次を使用してクライアントから呼び出すことができます

Context ctx = new InitialContext();
BookEJBRemote bookEJB = (BookEJBRemote) ctx.lookup("java:global/chapter08-service-1.0/BookEJB!org.agoncal.book.javaee7.chapter08.BookEJBRemote");

正常に動作し、メソッドを呼び出します。しかし、EJB やグラスフィッシュのインスタンスを見つける方法がわかりません。明らかに、ルックアップ文字列にはグラスフィッシュのサーバーまたはポートに関する手がかりはありません。

4

3 に答える 3

2

しかし、EJB やグラスフィッシュの instance.instance を見つける方法がわかりません。

JNDI サービスを介して EJB 参照を取得するには、基本的に次のことを行う必要があります。

  1. JNDI サーバーに接続する
  2. 接続すると、登録された名前を使用してオブジェクトを検索します。

JNDI サーバーに接続するには、InitialContext オブジェクトに、JNDI サーバーがリッスンしている IP/ポートなどのいくつかの情報を提供する必要があります。here で説明されているように、initialContext を初期化するにはさまざまな方法があります。

この情報を提供しない場合、InitialContext は、前の回答で提案されているように、デフォルト ポートで localhost のサービスを検索しようとします。

明らかに、ルックアップ文字列にはグラスフィッシュのサーバーまたはポートに関する手がかりはありません。

上記の理由により、ルックアップ名パラメーターの一部として URL またはポート情報が表示されません。

于 2013-10-27T01:44:54.660 に答える
0

Glassfish とクライアントを同じコンピューターで実行している場合、両方ともデフォルトの JNDI ポート 1099 を使用している可能性があり、両方が同じコンピューター上にあるため、ホストを指定する必要はありません。

つまり、クライアントが最初に JNDI サーバーに接続し、JNDI サーバーが EJB の場所 (通常は、EJB が使用可能なホストとポート) を返します。

否定的な言い方をするつもりはありませんが、EJB は約束されたものを提供しないテクノロジであることが証明されており、ほとんどの企業はずっと前に EJB を捨てたか、EJB から離れようと懸命に努力しています。

于 2013-10-26T15:01:54.570 に答える
0

InitialContextは、デフォルトのホスト (localhost) とデフォルトのポート番号を選択するだけではありません。この情報は、Java Webstart テクノロジを使用して行われる、glassfish 自体によって明示的に設定されます。

自分でテストできます: アプリケーションクライアントがコンテキストにデプロイされていると仮定しますlocalhost:8080/YourClient。リンクにアクセスすると、JNLP ファイルがダウンロードされ、Webstart によって開始されます。ファイルを自動的に開く代わりに、手動でファイルを保存できます (wget localhost:8080/YourClientたとえば、Linux の場合)。Glassfish が、JNDI 関連のプロパティを含む多くのパラメーターを使用してクライアント アプリケーションを初期化することがわかります。

<property name="java.naming.factory.initial" value="com.sun.enterprise.naming.SerialInitContextFactory"/>
<property name="java.naming.factory.url.pkgs" value="com.sun.enterprise.naming"/>
<property name="java.naming.factory.state" value="com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"/>
<property name="appclient.iiop.defaultHost" value="localhost"/>
<property name="appclient.iiop.defaultPort" value="${request.appclient.iiop.defaultPort}"/>
<property name="${appclient.download.host.propertyName}" value="localhost"/>
<property name="${appclient.user.code.is.signed.propertyName}" value="${appclient.user.code.is.signed}"/>

これらのプロパティは便宜上指定されているだけではなく、必須です。クライアント アプリケーションをスタンドアロン アプリケーションとして起動してみてください (お気に入りの IDE でメイン クラスを実行するだけです)。このような状況では、初期パラメータは設定されません。これらのプロパティがないと、InitialContext がうまく機能しないことに気付くでしょう。

あなたの質問に対する簡単な答え: InitialContext は、Glassfish と EJB を検索します。これは、アプリケーションが、InitialContext の場所、必要なクラスの初期化方法などを伝える特別なパラメーターで開始されたためです。

于 2014-01-28T15:10:20.390 に答える