2016-07-12 6 views
0

Я работаю над приложением весенней загрузки, где мне нужно XA, чтобы гарантировать, что JPA-обновления и генерация сообщений JMS - это все или ничего. Проблема в том, что когда происходит откат, DB откатывается назад, но не JMS-сообщение.Почему нет удаленной Weblogic JMS, участвующей в XA Transaction весной?

Я бегу со встроенным tomcat, а JMS-сервер - Weblogic12c.

Я следовал указаниям JTA из spring-boot documentation и добавил зависимостей для Atomikos (transactions-jms, transactions-jta, transactions-jdbc), а также spring-boot-starter-jta-atomikos.

В журналах я вижу, что Atomicos работает и что, кажется, запросы JPA добавляются к транзакции XA, но ничего для JMS.

Бревна ниже происходят из кода, где я делаю обновление JPA, а затем отправить сообщение JMS, используя JMSTemplate, то я бросить RuntimeException:

INFO c.a.jdbc.AbstractDataSourceBean - AtomikosDataSoureBean 'dataSource': getConnection (null)... 
INFO c.a.jdbc.AbstractDataSourceBean - AtomikosDataSoureBean 'dataSource': init... 
INFO c.a.i.imp.CompositeTransactionImp - addParticipant (XAResourceTransaction: 31302E33302E36302E3137332E746D30303030313030303434:31302E33302E36302E3137332E746D31) for transaction 10.30.60.173.tm0000100044 
INFO c.a.d.xa.XAResourceTransaction - XAResource.start (31302E33302E36302E3137332E746D30303030313030303434:31302E33302E36302E3137332E746D31 , XAResource.TMJOIN) on resource dataSource represented by XAResource instance [email protected] 
INFO c.a.i.imp.CompositeTransactionImp - registerSynchronization (com.a[email protected]f4a9582b) for transaction 10.30.60.173.tm0000100044 
INFO c.a.jdbc.AtomikosConnectionProxy - atomikos connection proxy for [email protected]: calling prepareStatement(select prjct_rvsn_seq_num_seq.nextval from dual)... 
INFO c.a.jdbc.AtomikosConnectionProxy - atomikos connection proxy for [email protected]: isClosed()... 
INFO c.a.jdbc.AtomikosConnectionProxy - atomikos connection proxy for [email protected]: calling getWarnings... 
INFO c.a.jdbc.AtomikosConnectionProxy - atomikos connection proxy for [email protected]: calling clearWarnings... 
INFO c.a.jdbc.AtomikosConnectionProxy - atomikos connection proxy for [email protected]: close()... 
INFO c.a.d.xa.XAResourceTransaction - XAResource.end (31302E33302E36302E3137332E746D30303030313030303434:31302E33302E36302E3137332E746D31 , XAResource.TMSUCCESS) on resource dataSource represented by XAResource instance [email protected] 
INFO c.c.ola.order.service.OrderService - Order saved of scope:FIRST with app ID:1127662  
INFO c.c.o.o.s.OrderEventBroadcaster - Sending message on queue jms/AppQueue 
DEBUG o.s.jms.core.JmsTemplate - Executing callback on JMS Session: [email protected] 
DEBUG o.s.j.s.d.JndiDestinationResolver - Located object with JNDI name [jms/AppQueue] 
DEBUG o.s.jms.core.JmsTemplate - Sending created message: TextMessage[null, <?xml version="1.0" encoding="...] 
INFO c.a.d.xa.XAResourceTransaction - XAResource.rollback (31302E33302E36302E3137332E746D30303030313030303434:31302E33302E36302E3137332E746D31) on resource dataSource represented by XAResource instance [email protected] 
INFO com.atomikos.icatch.jta.Sync2Sync - afterCompletion (STATUS_ROLLEDBACK) called on Synchronization: org.hibernate.resource.transaction[email protected]25385341 
INFO c.a.i.imp.CompositeTransactionImp - rollback() done of transaction 10.30.60.173.tm0000100044 

В моем Googling, я не видел много. Похоже, что он должен просто работать, но не там, где я сбросил мяч?

UPDATE:

Ниже, как я создаю мой ConnectionFactory:

@Bean 
FactoryBean<ConnectionFactory> jmsConnectionFactory(final JndiTemplate jndiTemplate) { 
    final JndiObjectFactoryBean beanFactory = new JndiObjectFactoryBean(); 

    beanFactory.setJndiTemplate(jndiTemplate); 
    beanFactory.setJndiName("jms.remoteConnectionFactory"); 
    beanFactory.setProxyInterface(ConnectionFactory.class); 

    return (FactoryBean) beanFactory; 
} 

UPDATE:

Поскольку журналы ссылаются weblogic.jms.client.WLSessionImpl вместо чего-то с "ХА" в имя, я исследовал, что weblogic возвращался. Экземпляр, возвращаемый из «jms.remoteConnectionFactory», был weblogic.jms.client.JMSXAConnectionFactory, который не реализует javax.jms.XAConnectionFactory, что кажется странным. Я не знаю, почему это так, или если это проблема, но похоже, что это возможно.

+0

Как вы настроили JMS? Я бы предположил, что вы не работаете с фабрикой соединений XA по какой-то причине –

+0

Я просто проверял это. Я вижу в дереве JNDI weblogic, что 'jms.remoteConnectionFactory' (именно так я создаю свой ConnectionFactory) имеет тип' weblogic.jms.client.JMSXAConnectionFactory'. Однако, похоже, что он не реализует 'javax.jms.XAConnectionFactory', но я не знаю, является ли это проблемой. – pgreen2

ответ

0

Моим решением было установить sessionTransacted на номер true на jmsTemplate.

@Bean 
JmsTemplate cciSitesJmsTemplate(@CciSites final ConnectionFactory connectionFactory, final JndiDestinationResolver destinationResolver) { 
    final JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory); 
    jmsTemplate.setDestinationResolver(destinationResolver); 
    // NOTE: sessionTransacted is required to join the XA transaction 
    jmsTemplate.setSessionTransacted(true); 
    return jmsTemplate; 
} 
Смежные вопросы