现在的位置: 首页 > 综合 > 正文

关于JNDI and EJB

2012年12月06日 ⁄ 综合 ⁄ 共 3381字 ⁄ 字号 评论关闭
JNDI (The Java Naming and Directory InterfaceJava 命名和目录接口) 是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。
 
命名服务:就像DNS一样,通过命名服务器提供服务,大部分的J2EE 服务器都含有命名服务器。
 
目录服务:一种简化的RDBMS 系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。
 
JNDI 的好处:
1)包含大量命名和目录服务,可以使用相同API 调用访问任何命名或目录服务。
2)可以同时连接多个命名和目录服务。
3)允许把名称同JAVA 对象或资源关联起来,不必知道对象或资源的物理ID
4)使用通用接口访问不同种类的目录服务
5)使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API 上。
 
上下文:由0 或多个绑定构成。比如java/MySqljava 为上下文(context),MySql 为命名
 
子上下文subConext):上下文下的上下文。比如MyJNDITree/ejb/helloBeanejb 为子上下文
 
因为JNDI 是一组接口,所以我们只需根据接口规范编程就可以。要通过JNDI 进行资源访问,我们必须设置初始化上下文的参数主要是设置JNDI 驱动的类名(java.naming.factory.initial) 和提供命名服务的URL (java.naming.provider.url)
 
因为Jndi 的实现产品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务器的不同而不同java.naming.provider.url 的值包括提供命名服务的主机地址和端口号。
 
访问Jboss 服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
 
访问Sun 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"com.sun.enterprise.naming.SerialInitContextFactory");
com.sun.jndi.cosnaming.CNCtxFactory 貌似是这个!
props.setProperty("java.naming.provider.url", "localhost:3700");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");
 
访问Weblogic10 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
props.setProperty("java.naming.provider.url", "t3://localhost:7001");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld");
 
 
JBOSS 环境下JNDI 树的命名约定:
1java:copm 这个上下文环境和其子上下文环境仅能被与之相关的特定应用组件访问和使用
2java: 子上下文环境和绑定的对象只能被Jboss 服务器虚拟机内的应用访问
3)其他上下文环境 只要实现序列化就可以被远程用户调用。

 

 

当你把EJB发布到JBOSS后,你就可以jboss 的管理平台查看她们的JNDI ,输入下面URL http://localhost:8080/jmx-console/点击“service=JNDIView” link,在出现的page里找到“List of MBean operations:”栏的“list()”方法,click “Invoke”button,就会看到下面的界面
在上图中可以看见HelloWorld 会话Bean JNDI路径,JNDI 路径名的组成规则是“上层名称/下层名称每层之间以”/”分隔HelloWorld 会话Bean JNDI路径名是:HelloWorldBean/remote
 
 
下面要重点说明一下Jboss EJB JNDI 名称默认的命名规则,命名规则如下:
1> 如果EJB 打包进后缀为*.ear J2EE 发布文件,默认的JNDI 路径名称是
访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例:EJB HelloWorld 打包进名为 HelloWorld.ear J2EE 应用,访问她远程接口的JNDI 名是:HelloWorld/HelloWorldBean/remote
 
2> 如果EJB 应用打包成后缀为*.jar 的发布文件, 默认的JNDI 路径名称是
访问本地接口:EJB-CLASS-NAME/local
访问远程接口:EJB-CLASS-NAME/remote
例: HelloWorld 应用打包成HelloWorld.jar 文件,访问她远程接口的JNDI 名称是:HelloWorldBean/remote
 
注意:EJB-CLASS-NAME 是不带包名的com.foshanshop.ejb3.impl.HelloWorldBean 只需取HelloWorldBean
 
目前网上很多教材获取JNDI 路径名的方式不适用在jboss 下,如:
HelloWorld helloworld = (HelloWorld) ctx.lookup(HelloWorld.class.getName());
这种方式适用于Sun Application Server glassfish
 

 

  

自定义JNDI 命名
默认的JNDI 命名规则上面已经介绍过,但有些情况下需要自定义名称。Jboss 要自定义JNDI 名称,可以使用@LocalBinding @RemoteBinding 注释
 
关键代码(只需要在bean interface前加binding注释):
 
import org.jboss.annotation.ejb.RemoteBinding;
。。。
@Remote
@RemoteBinding (jndiBinding="testbinding/myAccount")
publicinterface MyAccount extends Serializable {
    publicint Add(int a, int b);
    publicint getResult() ;
}
 
那么在client端调用上面的EJB的代码为:
InitialContext ctx = new InitialContext(props);
MyAccount bean1 = (MyAccount) ctx.lookup("testbinding/myAccount");

 

抱歉!评论已关闭.