您的位置:首页 > 其它

JNDI之旅--各应用服务器JNDI初始配置

2011-01-26 22:59 267 查看
使用Java EE应用服务器开发应用程序时,不管是在Web应用还是简单的Java Main中,当需要使用JDBC DataSource、JMS连接工厂、EJB的Home接口时,均需要通过应用服务器提供的JNDI服务,从JNDI Context中获取相应的对象。而且在获取初始的JNDI Context时,不同的应用服务器需要指定不同的属性传给InitialContext才能使用特定应用服务器的JNDI服务。本系列文章旨在透析为什么需要这些设置,一步一步解开JNDI的稍微神秘的面纱......,本文是"JNDI之旅"系列的第一篇

首先给出一个非常常见的代码Demo,以下典型的JNDI代码先是初始化一个InitialContext,然后从该Context中获得EJB的Home接口,从而便可进行EJB的调用。

try {
InitialContext context = new InitialContext();
Object obj = context.lookup("java:comp/env/ejb/HelloEJBRef");
HelloHome helloHome = (HelloHome) PortableRemoteObject.narrow(obj, HelloHome.class);
Hello hello = helloHome.create();
response.getWriter().write("Invoke EJB Starting...");//write data to HTTP Response
response.getWriter().write("<br>" + hello.sayHello());
response.getWriter().write("<br>Successed.");
} catch (NamingException e) {
throw new ServletException(e);
}


当然,以上的方式仅限于在Web应用中访问本服务器实例的JNDI服务时可以这样简单的获得JNDI Context,当客户端程序是一个需要访问远程JNDI服务的Web应用或者是一个Java Main的时候,通常需要指定JNDI初始化工厂类、JNDI服务所在的主机、JNDI服务所在主机的相应端口等这些比较标准的信息。当需要实现集群功能的话,还可以根据各个应用服务器厂商的特性,指定多个JNDI服务节点(实际就是多个服务器实例或者说是多台机器)信息,比如Glassfish在JNDI集群时需要指定com.sun.appserv.iiop.endpoints属性,用逗号分隔多个url。

各个应用服务器在使用JNDI服务的步骤上基本分为以下几步:

1,new一个Properties,properties是为了保存JNDI服务所需的属性

2,往properties中添加java.naming.factory.initial,这一步通常各个厂商都不一样

3,往properties中添加JNDI服务的主机和端口信息,这一步几乎每个厂商都支持设置"java.naming.provider.url"或者是"org.omg.CORBA.ORBInitialHost/org.omg.CORBA.ORBInitialPort"配置,其次就是各个厂商私有的指定主机和端口的方式了

4,有的应用服务器可能还需要设置java.naming.security.principal和java.naming.security.credentials属性指定用户和密码

5,最后把以上properties对象传递给InitialContext的构造函数便可完成JNDI Context的初始化,继而做lookup的动作

以下列举各个服务器的JNDI设置,其中特别要注意的是java.naming.factory.initial一定要根据不同的应用服务器做不同的配置

Glassfish

Properties props = new Properties();
//JNDI初始化工厂
props.setProperty("java.naming.factory.initial",
"com.sun.enterprise.naming.SerialInitContextFactory");
//下面两个可以不设置
props.setProperty("java.naming.factory.url.pkgs",
"com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state",
"com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

//以下关于地址的设置,可以任意选择一种方式
//方式1:使用标准的ORB设置,需要设置ORB的主机和端口,端口实际上就是Glassfish的IIOP监听的端口
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

//方式2:使用带iiop前缀的地址格式
props.setProperty("java.naming.provider.url", "iiop://localhost:3700");

//方式3:可以指定多个JNDI服务的地址,多个地址用逗号分隔
props.setProperty("com.sun.appserv.iiop.endpoints", "localhost:3700,localhost:13700");

InitialContext ic = new InitialContext(props);
ic.lookup(...)
...


JBoss

Properties props = new Properties();
//JNDI初始化工厂
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");

//方式1:JNDI服务主机和端口设置
props.setProperty("java.naming.provider.url", "localhost:1099");

InitialContext ic = new InitialContext(props);
ic.lookup(...)
...


Weblogic

Properties props = new Properties();
//JNDI初始化工厂
props.setProperty("java.naming.factory.initial",
"weblogic.jndi.WLInitialContextFactory");

//JNDI服务主机和端口的设置
props.setProperty("java.naming.provider.url", "t3://localhost:7001");
props.put("java.naming.security.credentials", new T3User("user1", "psw1"));

InitialContext ic = new InitialContext(props);
ic.lookup(...)
...


Websphere

Properties props = new Properties();
//JNDI初始化工厂
props.setProperty("java.naming.factory.initial",
"com.ibm.websphere.naming.WsnInitialContextFactory");

//JNDI服务主机和端口的设置
props.setProperty("java.naming.provider.url", "iiop://localhost:9001");

InitialContext ic = new InitialContext(props);
ic.lookup(...)
...


Geronimo

Properties props = new Properties();
//JNDI初始化工厂
props.setProperty("java.naming.factory.initial",
"org.openejb.client.RemoteInitialContextFactory");

//JNDI服务主机和端口的设置
props.setProperty("java.naming.provider.url", "localhost:4201");

//设置安全信息
props.setProperty("java.naming.security.principal", "username");
props.setProperty("java.naming.security.credentials", "passwd");

InitialContext ic = new InitialContext(props);
ic.lookup(...)
...


综上,各个服务器基本都实现了自己的JNDI工厂类,在设置主机和端口时基本都支持标准的java.naming.provider.url属性。在后续的文章中,会有如果实现自己的JNDI工厂类的相关讲解,敬请期待~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: