Автономный Spring JtaTransactionManager не работает с WAS - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать 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;
 }
 });
...