generified JtaTransactionManager code

This commit is contained in:
Juergen Hoeller 2009-05-15 15:04:11 +00:00
parent 33de330b0e
commit 814a807446
3 changed files with 26 additions and 22 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2006 the original author or authors. * Copyright 2002-2009 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,7 +17,6 @@
package org.springframework.transaction.jta; package org.springframework.transaction.jta;
import java.util.List; import java.util.List;
import javax.transaction.Status; import javax.transaction.Status;
import javax.transaction.Synchronization; import javax.transaction.Synchronization;
@ -25,16 +24,19 @@ import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationUtils; import org.springframework.transaction.support.TransactionSynchronizationUtils;
/** /**
* Adapter for a JTA Synchronization, invoking the <code>afterCompletion</code> of * Adapter for a JTA Synchronization, invoking the <code>afterCommit</code> /
* Spring TransactionSynchronizations after the outer JTA transaction has completed. * <code>afterCompletion</code> callbacks of Spring {@link TransactionSynchronization}
* objects callbacks after the outer JTA transaction has completed.
* Applied when participating in an existing (non-Spring) JTA transaction. * Applied when participating in an existing (non-Spring) JTA transaction.
* *
* @author Juergen Hoeller * @author Juergen Hoeller
* @since 2.0 * @since 2.0
* @see TransactionSynchronization#afterCommit
* @see TransactionSynchronization#afterCompletion
*/ */
public class JtaAfterCompletionSynchronization implements Synchronization { public class JtaAfterCompletionSynchronization implements Synchronization {
private final List synchronizations; private final List<TransactionSynchronization> synchronizations;
/** /**
@ -42,7 +44,7 @@ public class JtaAfterCompletionSynchronization implements Synchronization {
* @param synchronizations the List of TransactionSynchronization objects * @param synchronizations the List of TransactionSynchronization objects
* @see org.springframework.transaction.support.TransactionSynchronization * @see org.springframework.transaction.support.TransactionSynchronization
*/ */
public JtaAfterCompletionSynchronization(List synchronizations) { public JtaAfterCompletionSynchronization(List<TransactionSynchronization> synchronizations) {
this.synchronizations = synchronizations; this.synchronizations = synchronizations;
} }

View File

@ -141,7 +141,6 @@ import org.springframework.util.StringUtils;
* @see #setUserTransaction * @see #setUserTransaction
* @see #setTransactionManagerName * @see #setTransactionManagerName
* @see #setTransactionManager * @see #setTransactionManager
* @see JotmFactoryBean
* @see WebLogicJtaTransactionManager * @see WebLogicJtaTransactionManager
*/ */
public class JtaTransactionManager extends AbstractPlatformTransactionManager public class JtaTransactionManager extends AbstractPlatformTransactionManager
@ -256,9 +255,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
* A default one is used if not set. * A default one is used if not set.
*/ */
public void setJndiTemplate(JndiTemplate jndiTemplate) { public void setJndiTemplate(JndiTemplate jndiTemplate) {
if (jndiTemplate == null) { Assert.notNull(jndiTemplate, "JndiTemplate must not be null");
throw new IllegalArgumentException("jndiTemplate must not be null");
}
this.jndiTemplate = jndiTemplate; this.jndiTemplate = jndiTemplate;
} }
@ -560,7 +557,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Retrieving JTA UserTransaction from JNDI location [" + userTransactionName + "]"); logger.debug("Retrieving JTA UserTransaction from JNDI location [" + userTransactionName + "]");
} }
return (UserTransaction) getJndiTemplate().lookup(userTransactionName, UserTransaction.class); return getJndiTemplate().lookup(userTransactionName, UserTransaction.class);
} }
catch (NamingException ex) { catch (NamingException ex) {
throw new TransactionSystemException( throw new TransactionSystemException(
@ -584,7 +581,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Retrieving JTA TransactionManager from JNDI location [" + transactionManagerName + "]"); logger.debug("Retrieving JTA TransactionManager from JNDI location [" + transactionManagerName + "]");
} }
return (TransactionManager) getJndiTemplate().lookup(transactionManagerName, TransactionManager.class); return getJndiTemplate().lookup(transactionManagerName, TransactionManager.class);
} }
catch (NamingException ex) { catch (NamingException ex) {
throw new TransactionSystemException( throw new TransactionSystemException(
@ -608,7 +605,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Retrieving JTA TransactionSynchronizationRegistry from JNDI location [" + registryName + "]"); logger.debug("Retrieving JTA TransactionSynchronizationRegistry from JNDI location [" + registryName + "]");
} }
Class registryClass = ClassUtils.forName(TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME, Class<?> registryClass = ClassUtils.forName(TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME,
JtaTransactionManager.class.getClassLoader()); JtaTransactionManager.class.getClassLoader());
return getJndiTemplate().lookup(registryName, registryClass); return getJndiTemplate().lookup(registryName, registryClass);
} }
@ -669,7 +666,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
protected UserTransaction findUserTransaction() { protected UserTransaction findUserTransaction() {
String jndiName = DEFAULT_USER_TRANSACTION_NAME; String jndiName = DEFAULT_USER_TRANSACTION_NAME;
try { try {
UserTransaction ut = (UserTransaction) getJndiTemplate().lookup(jndiName, UserTransaction.class); UserTransaction ut = getJndiTemplate().lookup(jndiName, UserTransaction.class);
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("JTA UserTransaction found at default JNDI location [" + jndiName + "]"); logger.debug("JTA UserTransaction found at default JNDI location [" + jndiName + "]");
} }
@ -701,10 +698,9 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
} }
// Check fallback JNDI locations. // Check fallback JNDI locations.
for (int i = 0; i < FALLBACK_TRANSACTION_MANAGER_NAMES.length; i++) { for (String jndiName : FALLBACK_TRANSACTION_MANAGER_NAMES) {
String jndiName = FALLBACK_TRANSACTION_MANAGER_NAMES[i];
try { try {
TransactionManager tm = (TransactionManager) getJndiTemplate().lookup(jndiName, TransactionManager.class); TransactionManager tm = getJndiTemplate().lookup(jndiName, TransactionManager.class);
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("JTA TransactionManager found at fallback JNDI location [" + jndiName + "]"); logger.debug("JTA TransactionManager found at fallback JNDI location [" + jndiName + "]");
} }
@ -736,7 +732,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
throws TransactionSystemException { throws TransactionSystemException {
try { try {
Class registryClass = ClassUtils.forName(TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME, Class<?> registryClass = ClassUtils.forName(TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME,
JtaTransactionManager.class.getClassLoader()); JtaTransactionManager.class.getClassLoader());
// If we came here, we might be on Java EE 5, since the JTA 1.1 API is present. // If we came here, we might be on Java EE 5, since the JTA 1.1 API is present.
@ -1100,7 +1096,9 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
@Override @Override
protected void registerAfterCompletionWithExistingTransaction(Object transaction, List synchronizations) { protected void registerAfterCompletionWithExistingTransaction(
Object transaction, List<TransactionSynchronization> synchronizations) {
JtaTransactionObject txObject = (JtaTransactionObject) transaction; JtaTransactionObject txObject = (JtaTransactionObject) transaction;
logger.debug("Registering after-completion synchronization with existing JTA transaction"); logger.debug("Registering after-completion synchronization with existing JTA transaction");
try { try {
@ -1141,7 +1139,8 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
* @see javax.transaction.Transaction#registerSynchronization * @see javax.transaction.Transaction#registerSynchronization
* @see javax.transaction.TransactionSynchronizationRegistry#registerInterposedSynchronization * @see javax.transaction.TransactionSynchronizationRegistry#registerInterposedSynchronization
*/ */
protected void doRegisterAfterCompletionWithJtaTransaction(JtaTransactionObject txObject, List synchronizations) protected void doRegisterAfterCompletionWithJtaTransaction(
JtaTransactionObject txObject, List<TransactionSynchronization> synchronizations)
throws RollbackException, SystemException { throws RollbackException, SystemException {
int jtaStatus = txObject.getUserTransaction().getStatus(); int jtaStatus = txObject.getUserTransaction().getStatus();

View File

@ -35,6 +35,7 @@ import org.springframework.transaction.support.CallbackPreferringPlatformTransac
import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.DefaultTransactionStatus; import org.springframework.transaction.support.DefaultTransactionStatus;
import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
@ -170,7 +171,9 @@ public class WebSphereUowTransactionManager extends JtaTransactionManager
* Registers the synchronizations as interposed JTA Synchronization on the UOWManager. * Registers the synchronizations as interposed JTA Synchronization on the UOWManager.
*/ */
@Override @Override
protected void doRegisterAfterCompletionWithJtaTransaction(JtaTransactionObject txObject, List synchronizations) { protected void doRegisterAfterCompletionWithJtaTransaction(
JtaTransactionObject txObject, List<TransactionSynchronization> synchronizations) {
this.uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations)); this.uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations));
} }
@ -328,7 +331,7 @@ public class WebSphereUowTransactionManager extends JtaTransactionManager
} }
triggerBeforeCompletion(status); triggerBeforeCompletion(status);
if (status.isNewSynchronization()) { if (status.isNewSynchronization()) {
List synchronizations = TransactionSynchronizationManager.getSynchronizations(); List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
TransactionSynchronizationManager.clear(); TransactionSynchronizationManager.clear();
uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations)); uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations));
} }