【转】Spring JTA事务(WebLogic)配置

转:http://www.blogjava.net/luoqx/articles/16447.html 
  项目组开发服务器使用weblogic,应用服务器上配置了数据源,每个人开发使用eclipse,每人调试程序都使用本机,所以调试使用的服务是跟eclipse的tomcat插件,数据源可以使用tomcat的配置的和weblogic同名的数据源,可是JTA tomcat不支持。 
  因为整个项目组使用统一的配置管理,spring的applicationContext.xml大家都相同,每天还要做每日构建,部署到服务器上也与配置管理上的文件相同,所以想是否可以将数据源和JTAmanager配置成远程的。 
       查找spring官方文档,太简单没有这方面描述,上网google了半天,没找到(奇怪?其实后来想想也不奇怪,大家要么使用本地数据源(开发调试),要么使用应用服务的数据源也是在同一应用服务器上,而不是在远程使用(部署的生产环境)。),所以干脆看看源码算了。 
   已知如下配置可以访问到同一应用服务器的jndi数据源 

Java代码     收藏代码
  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  2.     <property name="jndiName">  
  3.         <value>jdbc/cqccms</value>  
  4.     </property>  
  5.  </bean>  


    记得当初使用jndi时可以远程访问写过client程序,主要除了要知道jndi名,还要设置jndi环境(Environment),所以查找一下JndiObjectFactoryBean的源代码,看看有没有设置jndi环境的方法,果然有setJndiEnvironment方法参数为properties,可以了,如下配置就能访问远程数据源了 

Java代码     收藏代码
  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  2.  <property name="jndiName">  
  3.   <value>jdbc/cqccms</value>  
  4.  </property>  
  5.  <property name="jndiEnvironment">   
  6.      <props>   
  7.         <prop key="java.naming.factory.initial">   
  8.           weblogic.jndi.WLInitialContextFactory   
  9.         </prop>   
  10.         <prop key="java.naming.provider.url">t3://172.16.101.42:7001</prop>   
  11.         <prop key="java.naming.security.principal">weblogic</prop>   
  12.         <prop key="java.naming.security.credentials">weblogic</prop>   
  13.      </props>      
  14.    </property>   
  15.   </bean>  

      
   不过要记得把weblogic.jar放到自己应用的lib下,要不找不到weblogic.jndi.WLInitialContextFactory类。 
   数据源搞定了,测试一下果真好用,不过jta对象远程访问好像没那么顺利,同理查看org.springframework.transaction.jta.JtaTransactionManager类,没有发现上述方法,不过看到了setJndiTemplate()方法,也不错现配置一个jndiTemplate,如下: 

Java代码     收藏代码
  1. <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate" singleton="true"  
  2.   lazy-init="default" autowire="default" dependency-check="default">  
  3.   <property name="environment">   
  4.      <props>   
  5.         <prop key="java.naming.factory.initial">   
  6.           weblogic.jndi.WLInitialContextFactory   
  7.         </prop>   
  8.         <prop key="java.naming.provider.url">t3://172.16.101.42:7001</prop>   
  9.         <prop key="java.naming.security.principal">weblogic</prop>   
  10.         <prop key="java.naming.security.credentials">weblogic</prop>   
  11.      </props>      
  12.    </property>   
  13.  </bean>  

      
  然后在配置一下transactionManager,如下 

Java代码     收藏代码
  1. <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" singleton="true"  
  2.   lazy-init="default" autowire="default" dependency-check="default">  
  3.   <property name="jndiTemplate">  
  4.    <ref local="jndiTemplate" />  
  5.   </property>  
  6.   <property name="userTransactionName">  
  7.    <value>weblogic/transaction/UserTransaction</value>  
  8.   </property>  
  9.  </bean>  


      不过JtaTransactionManager默认找jndi name为UserTransaction的jta对象,在同一应用服务器上可以,远程访问不到,后直接查看weblogic的jndi树找到这个jndi名weblogic/transaction/UserTransaction,配置上测试果然成功。

转自:http://keren.iteye.com/blog/409699

猜你喜欢

转载自mib168.iteye.com/blog/2009665