12

私はJavaEEを初めて使用します。現在、SunMicrosystemsによるJavaEE 6チュートリアル、第1巻(基本概念ベータ版)を受講しています。単調な読書から逃れるために、私は他の人が書いたいくつかのJavaEEプロジェクト/コードで遊んでいます。

私はSEから来ました。私の頭はまだSEでいっぱいです。SE(2層アプリケーション)では、

DATABASE_URL = "jdbc:mysql://something.db_server.com/db_name"

これは、私のクライアントがデータベースサーバーの場所を知る方法です。

私が見たJavaEEの例の1つ

// Access JNDI Initial Context.

Properties p = new Properties();

p.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
p.put("java.naming.provider.url","jnp://localhost:1099");
p.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

InitialContext ctx = new InitialContext(p);

// Change jndi name according to your server and ejb

HelloRemote remote = (HelloRemote) ctx.lookup("HelloBean/remote");

msg = "Message From EJB --> " + remote.sayHello();

これはわかりました。コードにはURLとポート番号があります。この行があります

p.put("java.naming.provider.url","jnp://localhost:1099");

クライアント側は、URLによってサーバーがどこにあり、どのポートをノックするかを知っています。コードはJavaEE5の時点で書かれたと思います。

今日、Netbeans 7、Java EE 6、およびGlassFish3が使用されている別の例を見つけました。クライアント側のコード

@EJB
private static MySessionRemote mySession;

/**
 * @param args the command line arguments
 */

public static void main(String[] args) {
    JOptionPane.showMessageDialog(null, 
            "result = " + mySession.getResult());
}

リンクは次のとおりです http://netbeans.org/kb/docs/javaee/entappclient.html

URLとポート番号は指定されていません。

DavidR.HeffelfingerによるNetbeans7を使用したJavaEE6開発には、第7章に同様の例があります。著者は、本の中でそれがどのように行われるかを説明していません。彼はそれをやったと思いますが、私はおそらくそれを逃しました…</ p>

私の質問は、クライアント側がURLなしでサーバーを見つける方法です。それらのxmlファイルの1つに記載されていますか?クライアントはカリフォルニアにあり、GlassFishサーバーはニューヨークにあります。誰かが私にそれを説明したり、私が答えを見つけることができるチュートリアル/ブログ/記事を指摘したりできますか?

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

4

2 に答える 2

9

ここで起こっていることが2つあります。

まず、リモートEJBへの参照を取得する方法がJavaEEで指定されていないことです。あなたは、個々のベンダーがそれを行うべきだと考える方法に翻弄されています。

JNDIはこれに使用される事実上の標準ですが、これ自体も必須ではありません。

例:AS7までのJBoss

AS7までのJBossASでは、リモート参照を取得するために次のシーケンスが使用されていました。

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
env.put(Context.PROVIDER_URL, "jnp://myserver.example.com:1099");
InitialContext context = new InitialContext(env);

Bean bean = (Bean) context.lookup("myear/MyBean/remote");

ここでは、リモートサーバーのURLが初期コンテキストに提供され、そのコンテキストからBeanが取得されます。(ここによく知られている「java:/」プレフィックスを追加しないでください。追加しないと、リモートコンテキストでルックアップを実行しても、JNDIによってインターセプトされ、ローカルで解決されます)

この方法は前述のとおり標準化されていないため、単一のベンダーが実装のリリース間で完全に変更できます。同じJavaEEバージョンの実装でも。

例:JBoss AS7

JBoss AS 7では、JBossはJNDIから離れたいと考えていました(JNDIを使用する必要があることが指定されていなかったため)。現在、これはほぼ次のように発生します。

jboss-ejb-client.properties最初に、次のコンテキストでクラスパスにファイルを配置する必要があります。

endpoint.name = client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED = false
remote.connections = default
remote.connection.default.host = myserver.example.com
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS = false

そして、次のようにコードを使用します。

Properties env = new Properties();
env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext context = new InitialContext(env);

Bean bean = (Bean) context.lookup("ejb:/myear/mymodule/MyBean!com.example.Bean");

したがって、コードからはURLが指定されていないように見えますが、構成ファイルに静的に隠されています。


アプリケーションクライアントコンテナ

今日、Netbeans 7、Java EE 6、およびGlassFish3が使用されている別の例を見つけました。クライアント側のコード[...]

これはまた別のことです。いわゆるアプリケーションクライアントコンテナ(別名ACC)があることが実証されています。

これは、JavaSEアプリケーションがJNDIを使用してリモートサーバーに接続する上記の例とは異なります。アプリケーションクライアントコンテナは、JavaEEでは少しわかりにくいものです。アイデアは、サーバーからクライアントコードを動的にダウンロードし(アプレットやJava Web Startアプリなど)、それがどこから来たのかを魔法のように「知っている」ということのようです。メインクラスでの(静的)インジェクションのサポートは非​​常に限られており、リモートBeanを直接インジェクトするために使用できます。

アプリケーションクライアントコンテナは、Java EEの初期のアイデアであり、私が知る限り、あまり注目されていません。これらすべての年月を経て、それは最初の構想からそれほど進歩したことはありません。それでもベンダー固有の作業が大量に必要になるため、ほとんどの人はそれを気にせず、JNDIを使用するだけだと思います。

于 2012-11-30T14:25:33.827 に答える
2

jndi.properties構成データを含むファイルが必要になります。クライアントは、クライアントと同じホストで実行されているサーバーに接続する必要がある場合でも、接続するサーバーを魔法のように知ることはできません。複数存在する可能性があります。

ただし、この例は非常に奇妙です。EJBアノテーションは、クライアントアプリケーションとしてではなく、JavaEEコンテナで実行されることになっていることを示します。

また、クライアントアプリケーションでEJBを呼び出すことは、それほど一般的ではないことにも注意してください。その多くはサーバー側のテクノロジーです。クライアントアプリケーションへのインターフェイスを提供したい場合は、たとえばJAX-RSを介したRESTfulWebサービスを使用する方がはるかに簡単で移植性があります。

于 2012-11-30T10:28:45.360 に答える