簡體   English   中英

EJB客戶端如何在沒有url的情況下找到EJB服務器?

[英]How does the EJB client locate the EJB server without url?

我是Java EE的新手。 目前,我正在閱讀Sun Microsystems 的Java EE 6 Tutorial,Volume 1(Basic Concepts Beta) 為了避免單調的閱讀時間,我玩其他人編寫的Java EE項目/代碼很少。

我來自SE。 我的頭仍然充滿了SE。 在SE( 兩層應用程序)中我使用

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

這就是我的客戶端知道數據庫服務器的位置。

在我看到的一個Java EE示例中

// 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知道服務器在哪里以及敲擊哪個端口。 我認為代碼是在Java EE 5時編寫的。

今天我發現了另一個使用Netbeans 7,Java EE 6和GlassFish 3的例子。 客戶端代碼

@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

沒有給出網址和端口號。

Java EE 6開發與Netbeans 7由David R. Heffelfinger在第7章中有一個類似的例子。作者沒有解釋如何在書中完成它。 我想他已經做到了但我可能錯過了......

我的問題是客戶端如何在沒有URL的情況下找到服務器? 是否在其中一個xml文件中聲明了? 客戶可以在加利福尼亞州,GlassFish Server可以在紐約。 任何人都可以向我解釋或指向任何教程/博客/文章,我可以找到答案嗎?

謝謝。

這里有兩件事情。

第一件事是在Java EE中沒有指定獲取對遠程EJB的引用的方式。 您將受到個別供應商認為應該如何完成的擺布。

雖然JNDI是用於此的事實上的標准,但即使這本身也沒有強制要求。

示例:JBoss直到AS7

在JBoss AS中直到AS 7,使用以下序列來獲取遠程引用:

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截獲並在本地解析,盡管在遠程上下文中進行查找)

由於提到的方法不是標准化的,因此單個供應商可以在實現版本之間完全更改它。 即使是針對相同Java EE版本的實現也是如此。

示例: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和GlassFish 3的例子。 客戶端代碼[...]

這是另一回事。 所展示的是所謂的應用客戶端容器 (又名ACC)。

這與上面的示例不同,其中Java SE應用程序使用JNDI聯系遠程服務器。 Application Client容器在Java EE中有點模糊。 這個想法似乎是您從服務器(如Applet或Java Web Start應用程序)動態下載客戶端代碼,然后它神奇地“知道”它的來源。 主類中對(靜態)注入的支持非常有限,您可以使用它直接注入遠程bean。

應用程序客戶端容器是Java EE早期的一個想法,據我所知,從未引起太多關注。 經過這么多年,它在最初構想之后從未取得過多進步。 由於它仍然需要大量供應商特定的事情,我認為大多數人不打擾它只是使用JNDI。

需要一個包含配置數據的jndi.properties文件。 即使客戶端需要連接到與客戶端在同一主機上運行的服務器,客戶端也無法神奇地知道要連接的服務器 - 仍然可能有多個服務器。

這個例子很奇怪 - EJB注釋表明它應該在Java EE容器中運行,而不是作為客戶端應用程序運行。

我還要注意,在客戶端應用程序中調用EJB並不常見; 它更像是服務器端技術。 如果要為客戶端應用程序提供接口,則通過JAX-RS可以更輕松,更便攜地使用RESTful Web服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM