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.
Wie haben Sie JMS konfiguriert? Ich nehme an, dass Sie aus irgendeinem Grund nicht mit einer XA-Verbindungsfabrik arbeiten. –
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