2016-07-12 38 views
0

Ich arbeite an einer Spring-Boot-Anwendung, wo ich XA brauche, um sicherzustellen, dass JPA-Updates und JMS-Nachrichten entweder alles oder nichts sind. Das Problem ist, wenn ein Rollback stattfindet, Rollback DB, aber nicht die JMS-Nachricht.Warum ist Remote Weblogic JMS nicht an der XA-Transaktion im Frühjahrsstart beteiligt?

Ich bin mit eingebetteten Tomcat ausgeführt und JMS-Server ist Weblogic12c.

folgte ich den JTA Richtungen von der spring-boot documentation und addiert die Abhängigkeiten für Atomikos (transactions-jms, transactions-jta, transactions-jdbc) sowie spring-boot-starter-jta-atomikos.

In den Protokollen kann ich sehen, dass Atomikos ausgeführt wird und scheinbar die JPA-Abfragen der XA-Transaktion hinzugefügt werden, aber nichts für JMS.

Die Protokolle aus dem Code unten kommen, wo ich JPA-Updates zu tun, dann Nachricht JMS senden JMSTemplate verwenden, dann werfe ich ein 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 

In meinem googeln, ich habe nicht viel gesehen. Es scheint, dass es einfach funktionieren sollte, aber es ist nicht wo habe ich den Ball fallen lassen?

UPDATE:

Unten ist, wie ich meine die Schaffung 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:

Da die Protokolle weblogic.jms.client.WLSessionImpl anstatt etwas mit "XA" verwiesen Der Name, ich untersuchte, was Weblogic zurückgab. Die von "jms.remoteConnectionFactory" zurückgegebene Instanz war weblogic.jms.client.JMSXAConnectionFactory, die javax.jms.XAConnectionFactory nicht implementiert, was seltsam erscheint. Ich weiß nicht, warum das so ist oder ob das ein Problem ist, aber es scheint so als könnte es sein.

+0

Wie haben Sie JMS konfiguriert? Ich nehme an, dass Sie aus irgendeinem Grund nicht mit einer XA-Verbindungsfabrik arbeiten. –

+0

Ich habe das gerade überprüft. Ich kann in der JNDI-Struktur von Weblogic sehen, dass 'jms.remoteConnectionFactory' (wie ich meine ConnectionFactory erstelle) vom Typ' weblogic.jms.client.JMSXAConnectionFactory' ist. Es scheint jedoch nicht, dass es implementiert 'javax.jms.XAConnectionFactory', aber ich weiß nicht, ob das ein Problem ist. – pgreen2

Antwort

0

Meine Lösung war sessionTransacted zu true auf der 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; 
}