【转】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代码
[*]<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
[*] <property name="jndiName">
[*] <value>jdbc/cqccms</value>
[*] </property>
[*] </bean>
记得当初使用jndi时可以远程访问写过client程序,主要除了要知道jndi名,还要设置jndi环境(Environment),所以查找一下JndiObjectFactoryBean的源代码,看看有没有设置jndi环境的方法,果然有setJndiEnvironment方法参数为properties,可以了,如下配置就能访问远程数据源了
Java代码
[*]<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
[*] <property name="jndiName">
[*] <value>jdbc/cqccms</value>
[*] </property>
[*] <property name="jndiEnvironment">
[*] <props>
[*] <prop key="java.naming.factory.initial">
[*] weblogic.jndi.WLInitialContextFactory
[*] </prop>
[*] <prop key="java.naming.provider.url">t3://172.16.101.42:7001</prop>
[*] <prop key="java.naming.security.principal">weblogic</prop>
[*] <prop key="java.naming.security.credentials">weblogic</prop>
[*] </props>
[*] </property>
[*] </bean>
不过要记得把weblogic.jar放到自己应用的lib下,要不找不到weblogic.jndi.WLInitialContextFactory类。
数据源搞定了,测试一下果真好用,不过jta对象远程访问好像没那么顺利,同理查看org.springframework.transaction.jta.JtaTransactionManager类,没有发现上述方法,不过看到了setJndiTemplate()方法,也不错现配置一个jndiTemplate,如下:
Java代码
[*]<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate" singleton="true"
[*] lazy-init="default" autowire="default" dependency-check="default">
[*] <property name="environment">
[*] <props>
[*] <prop key="java.naming.factory.initial">
[*] weblogic.jndi.WLInitialContextFactory
[*] </prop>
[*] <prop key="java.naming.provider.url">t3://172.16.101.42:7001</prop>
[*] <prop key="java.naming.security.principal">weblogic</prop>
[*] <prop key="java.naming.security.credentials">weblogic</prop>
[*] </props>
[*] </property>
[*] </bean>
然后在配置一下transactionManager,如下
Java代码
[*]<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" singleton="true"
[*] lazy-init="default" autowire="default" dependency-check="default">
[*] <property name="jndiTemplate">
[*] <ref local="jndiTemplate" />
[*] </property>
[*] <property name="userTransactionName">
[*] <value>weblogic/transaction/UserTransaction</value>
[*] </property>
[*] </bean>
不过JtaTransactionManager默认找jndi name为UserTransaction的jta对象,在同一应用服务器上可以,远程访问不到,后直接查看weblogic的jndi树找到这个jndi名weblogic/transaction/UserTransaction,配置上测试果然成功。
转自:http://keren.iteye.com/blog/409699
页:
[1]