Я пытаюсь использовать Spring JtaTransactionManager (WebSphereUowTransactionManager) в отдельной программе с WAS9.0.JndiTemplate извлекается с помощью поиска Jndi и устанавливается в пружинный JtaTransactionManager.Ресурсы dataSource и JMS, которые являются жалобой XA, также извлекаются из поиска Jndi на сервер.Проблема, с которой я здесь сталкиваюсь, заключается в том, что операция, выполняемая в блоке транзакции, немедленно фиксируется.Похоже, что ресурсы не управляются менеджером транзакций.В клиентской программе есть все библиотеки времени выполнения WAS в classpath
Спасибо, если кто-то может помочь здесь и подскажет, как мы можем заставить WebSphereUowTransactionManager работать вне контейнера.
applicationContext_Jta.xml:
<bean id="jndiTemplateLookUp" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.provider.url">iiop://ip:port</prop>
<prop key="java.naming.factory.initial">com.ibm.websphere.naming.WsnInitialContextFactory</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplateLookUp"/>
<property name="jndiName" value="jdbc/WSDataSource"/>
</bean>
Main Code:
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
ApplicationContext jtaApplicationCtx = new ClassPathXmlApplicationContext("applicationContext_Jta.xml");
JndiTemplate jndiTemplate = (JndiTemplate) jtaApplicationCtx.getBean("jndiTemplateLookUp");
DataSource datasource = (DataSource) jtaApplicationCtx.getBean("dataSource");
JtaTransactionManager transactionManager = new WebSphereUowTransactionManager();
transactionManager.setJndiTemplate(jndiTemplate);
transactionManager.afterPropertiesSet();
((CallbackPreferringPlatformTransactionManager) transactionManager).execute(transactionDefinition,
new TransactionCallback<Integer>() {
@Override
public Integer doInTransaction(TransactionStatus transactionStatus) {
//DB SQL Execute
//JMS Send
return 0;
}
});