S A*_*S A 12 java ejb jndi java-ee
我是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();
Run Code Online (Sandbox Code Playgroud)
我明白了.代码有url和端口号.有这条线
p.put("java.naming.provider.url","jnp://localhost:1099");
Run Code Online (Sandbox Code Playgroud)
客户端通过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());
}
Run Code Online (Sandbox Code Playgroud)
这是链接 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 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");
Run Code Online (Sandbox Code Playgroud)
这里,远程服务器的URL被提供给初始上下文,并且从该上下文中检索bean.(请注意,您不能在此处添加众所周知的"java:/"前缀,否则它将被JNDI截获并在本地解析,尽管在远程上下文中进行查找)
由于提到的方法不是标准化的,因此单个供应商可以在实现版本之间完全更改它.即使是针对相同Java EE版本的实现也是如此.
在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
Run Code Online (Sandbox Code Playgroud)
并使用代码如下:
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");
Run Code Online (Sandbox Code Playgroud)
所以从代码看起来没有给出URL,但它静态地隐藏在配置文件中.
今天我发现了另一个使用Netbeans 7,Java EE 6和GlassFish 3的例子.客户端代码[...]
这是另一回事.所展示的是所谓的应用客户端容器(又名ACC).
这与上面的示例不同,其中Java SE应用程序使用JNDI联系远程服务器.Application Client容器在Java EE中有点模糊.这个想法似乎是您从服务器(如Applet或Java Web Start应用程序)动态下载客户端代码,然后它神奇地"知道"它的来源.主类中对(静态)注入的支持非常有限,您可以使用它直接注入远程bean.
应用程序客户端容器是Java EE早期的一个想法,据我所知,从未得到太多关注.经过这么多年,它在最初构想之后从未取得太大进展.由于它仍然需要大量供应商特定的事情,我认为大多数人不打扰它只是使用JNDI.
| 归档时间: |
|
| 查看次数: |
12538 次 |
| 最近记录: |