JNDI jboss

JBoss 有以下两种绑定规则: 

缺省绑定  缺省情况下,会话 Bean 的 JNDI 绑定名称是: 

* local 接口:<ejbName>/local 

* remote 接口:<ejbName>/remote 

当 EJB 被部署到某个 ear 中后,缺省绑定名称中会以 ear 包的名称作为前缀。比如,ear 文件是 test.ear 时,EJB 的绑定名称是: 

* local 接口:test/<ejbName>/local 

* remote 接口:test/<ejbName>/remote 

用户自定义的绑定 

Jboss 中,用户可以通过 @LocalBinding 或 @RemoteBinding 为某个 EJB 自定义JNDI 绑定名称。注意:@LocalBinding 和 @RemoteBinding 是 JBoss 自提供的扩展注释,而非 EJB 3 规范的标准注释。建议不要使用!示例: 

 

Java代码 
  1. import org.jboss.annotation.ejb.LocalBinding;  
  2.   
  3. import org.jboss.annotation.ejb.RemoteBinding;  
  4.   
  5. @Stateless  
  6.   
  7. @RemoteBinding (jndiBinding="aaa/Remote")  
  8.   
  9. @LocalBinding (jndiBinding="mybean_Local")  
  10.   
  11. public class MyBean implements .... { ... }  

在Java EE 5 中仍然支持正规的XML 发布描述符,例如Java EE 标准规定的ejb-jar.xml 和服务器特定的描述符例如jboss.xml。而且,如果配置文件中的值和标注中的发生了冲突,则以配置文件中的内容为准,ejb-jar.xml 文件需要新建在src/META-INF/目录下,在此文件中,我们主要通过配置文件定义了一个EJB,其中的ejb-name 的取值对应@Stateless 标注中的name 属性,business-local 对应本地接口,business-remote 对应远程接口,ejb-class 对应作为EJB 发布的Bean 实现类,session-type 则对应了有状态或者无状态。代码清单如下: 

Java代码 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0"  
  4.   
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.   
  7. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  8.   
  9. http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">  
  10.   
  11. <enterprise-beans>  
  12.   
  13. <session>  
  14.   
  15. <ejb-name>MySessionBean</ejb-name>  
  16.   
  17. <business-local>conftest.NewSessionLocal</business-local>  
  18.   
  19. <business-remote>conftest.NewSessionRemote</business-remote>  
  20.   
  21. <ejb-class>conftest.NewSessionBean</ejb-class>  
  22.   
  23. <session-type>Stateless</session-type>  
  24.   
  25. </session>  
  26.   
  27. </enterprise-beans>  
  28.   
  29. </ejb-jar>  

jboss.xml 也位于同一目录下,注意这个文件名完全是JBoss 规定的,属于厂商特定的配置文件(换句话说别的服务器类似的文件名将会不一样),代码清单如下: 

Java代码 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <jboss>  
  4.   
  5. <enterprise-beans>  
  6.   
  7. <session>  
  8.   
  9. <ejb-name>MySessionBean</ejb-name>  
  10.   
  11. <jndi-name>MySessionBeanTest</jndi-name>  
  12.   
  13. <local-jndi-name>MySession_Local</local-jndi-name>  
  14.   
  15. <!--  
  16.   
  17. <remote-jndi-name>MySessionRemote</remote-jndi-name>-->  
  18.   
  19. </session>  
  20.   
  21. </enterprise-beans>  
  22.   
  23. </jboss>  


关于获取数据源的语法,大体有(javax.sql.DataSource) ctx.lookup ("java:comp/env/XXX")和(javax.sql.DataSource) ctx.lookup("XXX")两种写法,好多人以为这两种写法是相同的,以为都是通过JNDI来获取数据源。其实java:comp/env和 JNDI是不同的,java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有: 
---------JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明 
---------JMS 连接工厂在java:comp/env/jms 子上下文中声明 
---------JavaMail 连接工厂在java:comp/env/mail 子上下文中声明 
---------URL 连接工厂在 java:comp/env/url子上下文中声明 

假如你写了一个EJB,获取datasource如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/DBPool"); 
那么在配置文件中进行资源映射时,在ejb-jar.xml中, 
     <resource-ref> 
       <res-ref-name>jdbc/DBPool</res-ref-name> 
       <res-type>javax.sql.DataSource</res-type> 
       <res-auth>Container</res-auth> 
     </resource-ref> 
在weblogic-ejb-jar.xml中, 
   <reference-descriptor> 
     <resource-description> 
       <res-ref-name>jdbc/DBPool</res-ref-name> 
       <jndi-name>OraDataSource</jndi-name> 
     </resource-description> 
   </reference-descriptor> 
//转者注:如果是在jboss则在jboss.xml中做如下修改 
   <resource-managers> 
       <resource-manager> 
           <res-name>jdbc/DBPool</res-name> 
           <res-jndi-name>OraDataSource</res-jndi-name> 
       </resource-manager> 
   </resource-managers> 
实际服务器中的JNDI名字是OraDataSource,逻辑名jdbc/DBPool只是用来和它作映射的,这样做的好处是为了提高可移植性,移植的时候只需要把配置文件改一下就可以,而应用程序可不用改动。 

假如你写了一个一般的应用程序,想直接通过JNDI来获取数据源,那么直接lookup(“mytest”)就可以了(假如服务器上的JNDI为mytest),用第一种写法反而会报错的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值