加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – EJB客户端如何找不到没有url的EJB服务器?

发布时间:2020-12-15 00:09:07 所属栏目:Java 来源:网络整理
导读:我是 Java EE的新手.目前,我正在通过Sun Microsystems的Java EE 6教程第1卷(基本概念测试版).为了摆脱单调的阅读时间,我玩几个Java EE项目/其他人编写的代码. 我来自SE.我的头仍然充满了SE.在SE(两层应用程序)我使用 DATABASE_URL =“jdbc:mysql://somethi
我是 Java EE的新手.目前,我正在通过Sun Microsystems的Java EE 6教程第1卷(基本概念测试版).为了摆脱单调的阅读时间,我玩几个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

没有提供URL和端口号.

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必须被使用),现在它发生在大约following way:

您将首先需要使用以下上下文将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,但它是静态隐藏在一个配置文件中.

应用程序客户端容器

Today I have found another example where Netbeans 7,Java EE 6,and GlassFish 3 are used. The client side code […]

这是另一回事.所示的是所谓的应用程序客户端容器(也称为ACC).

这与上面的示例不同,其中Java SE应用程序使用JNDI联系远程服务器.应用程序客户端容器在Java EE中有点晦涩难懂.这个想法似乎是您从服务器(如Applet或Java Web Start应用程序)动态下载客户端代码,然后神奇地“知道”它来自哪里.在主类中对(静态)注入的支持非常有限,可以直接注入远程bean.

应用程序客户端容器是Java EE早期的一个想法,据我所知,从未受到关注.经过这些年,它的初期概念从未发生过.由于它仍然需要大量的供应商特定的事情来做,所以我认为大多数人不用打扰它,只使用JNDI.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读