我来自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.