提交 0b37cec2 编写于 作者: J Juergen Hoeller

Consistent support for JTA 1.1 TransactionSynchronizationRegistry

JtaTransactionManager's configuration options for a TransactionSynchronizationRegistry are now in sync with the options for UserTransaction/TransactionManager. Specifically, there are setTransactionSynchronizationRegistry/getTransactionSynchronizationRegistry methods for programmatic configuration now.  Motivated by Spring's adapting to a Hibernate JtaPlatform, specifically the Hibernate 4.3 changes in that area.

Issue: SPR-10839
上级 0ac6998e
...@@ -164,9 +164,11 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager ...@@ -164,9 +164,11 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
private boolean autodetectTransactionManager = true; private boolean autodetectTransactionManager = true;
private transient TransactionSynchronizationRegistry transactionSynchronizationRegistry;
private String transactionSynchronizationRegistryName; private String transactionSynchronizationRegistryName;
private transient TransactionSynchronizationRegistry transactionSynchronizationRegistry; private boolean autodetectTransactionSynchronizationRegistry = true;
private boolean allowCustomIsolationLevels = false; private boolean allowCustomIsolationLevels = false;
...@@ -327,7 +329,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager ...@@ -327,7 +329,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
} }
/** /**
* Return the JTA TransactionManager that this transaction manager uses. * Return the JTA TransactionManager that this transaction manager uses, if any.
*/ */
public TransactionManager getTransactionManager() { public TransactionManager getTransactionManager() {
return this.transactionManager; return this.transactionManager;
...@@ -363,6 +365,28 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager ...@@ -363,6 +365,28 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
this.autodetectTransactionManager = autodetectTransactionManager; this.autodetectTransactionManager = autodetectTransactionManager;
} }
/**
* Set the JTA 1.1 TransactionSynchronizationRegistry to use as direct reference.
* <p>A TransactionSynchronizationRegistry allows for interposed registration
* of transaction synchronizations, as an alternative to the regular registration
* methods on the JTA TransactionManager API. Also, it is an official part of the
* Java EE 5 platform, in contrast to the JTA TransactionManager itself.
* <p>Note that the TransactionSynchronizationRegistry will be autodetected in JNDI and
* also from the UserTransaction/TransactionManager object if implemented there as well.
* @see #setTransactionSynchronizationRegistryName
* @see #setAutodetectTransactionSynchronizationRegistry
*/
public void setTransactionSynchronizationRegistry(TransactionSynchronizationRegistry transactionSynchronizationRegistry) {
this.transactionSynchronizationRegistry = transactionSynchronizationRegistry;
}
/**
* Return the JTA 1.1 TransactionSynchronizationRegistry that this transaction manager uses, if any.
*/
public TransactionSynchronizationRegistry getTransactionSynchronizationRegistry() {
return this.transactionSynchronizationRegistry;
}
/** /**
* Set the JNDI name of the JTA 1.1 TransactionSynchronizationRegistry. * Set the JNDI name of the JTA 1.1 TransactionSynchronizationRegistry.
* <p>Note that the TransactionSynchronizationRegistry will be autodetected * <p>Note that the TransactionSynchronizationRegistry will be autodetected
...@@ -374,6 +398,20 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager ...@@ -374,6 +398,20 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
this.transactionSynchronizationRegistryName = transactionSynchronizationRegistryName; this.transactionSynchronizationRegistryName = transactionSynchronizationRegistryName;
} }
/**
* Set whether to autodetect a JTA 1.1 TransactionSynchronizationRegistry object
* at its default JDNI location ("java:comp/TransactionSynchronizationRegistry")
* if the UserTransaction has also been obtained from JNDI, and also whether
* to fall back to checking whether the JTA UserTransaction/TransactionManager
* object implements the JTA TransactionSynchronizationRegistry interface too.
* <p>Default is "true", autodetecting the TransactionSynchronizationRegistry
* unless it has been specified explicitly. Can be turned off to delegate
* synchronization registration to the regular JTA TransactionManager API.
*/
public void setAutodetectTransactionSynchronizationRegistry(boolean autodetectTransactionSynchronizationRegistry) {
this.autodetectTransactionSynchronizationRegistry = autodetectTransactionSynchronizationRegistry;
}
/** /**
* Set whether to allow custom isolation levels to be specified. * Set whether to allow custom isolation levels to be specified.
* <p>Default is "false", throwing an exception if a non-default isolation level * <p>Default is "false", throwing an exception if a non-default isolation level
...@@ -404,38 +442,36 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager ...@@ -404,38 +442,36 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
* @throws TransactionSystemException if initialization failed * @throws TransactionSystemException if initialization failed
*/ */
protected void initUserTransactionAndTransactionManager() throws TransactionSystemException { protected void initUserTransactionAndTransactionManager() throws TransactionSystemException {
// Fetch JTA UserTransaction from JNDI, if necessary.
if (this.userTransaction == null) { if (this.userTransaction == null) {
// Fetch JTA UserTransaction from JNDI, if necessary.
if (StringUtils.hasLength(this.userTransactionName)) { if (StringUtils.hasLength(this.userTransactionName)) {
this.userTransaction = lookupUserTransaction(this.userTransactionName); this.userTransaction = lookupUserTransaction(this.userTransactionName);
this.userTransactionObtainedFromJndi = true; this.userTransactionObtainedFromJndi = true;
} }
else { else {
this.userTransaction = retrieveUserTransaction(); this.userTransaction = retrieveUserTransaction();
if (this.userTransaction == null && this.autodetectUserTransaction) {
// Autodetect UserTransaction at its default JNDI location.
this.userTransaction = findUserTransaction();
}
} }
} }
// Fetch JTA TransactionManager from JNDI, if necessary.
if (this.transactionManager == null) { if (this.transactionManager == null) {
// Fetch JTA TransactionManager from JNDI, if necessary.
if (StringUtils.hasLength(this.transactionManagerName)) { if (StringUtils.hasLength(this.transactionManagerName)) {
this.transactionManager = lookupTransactionManager(this.transactionManagerName); this.transactionManager = lookupTransactionManager(this.transactionManagerName);
} }
else { else {
this.transactionManager = retrieveTransactionManager(); this.transactionManager = retrieveTransactionManager();
if (this.transactionManager == null && this.autodetectTransactionManager) {
// Autodetect UserTransaction object that implements TransactionManager,
// and check fallback JNDI locations otherwise.
this.transactionManager = findTransactionManager(this.userTransaction);
}
} }
} }
// Autodetect UserTransaction at its default JNDI location.
if (this.userTransaction == null && this.autodetectUserTransaction) {
this.userTransaction = findUserTransaction();
}
// Autodetect UserTransaction object that implements TransactionManager,
// and check fallback JNDI locations else.
if (this.transactionManager == null && this.autodetectTransactionManager) {
this.transactionManager = findTransactionManager(this.userTransaction);
}
// If only JTA TransactionManager specified, create UserTransaction handle for it. // If only JTA TransactionManager specified, create UserTransaction handle for it.
if (this.userTransaction == null && this.transactionManager != null) { if (this.userTransaction == null && this.transactionManager != null) {
this.userTransaction = buildUserTransaction(this.transactionManager); this.userTransaction = buildUserTransaction(this.transactionManager);
...@@ -477,15 +513,20 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager ...@@ -477,15 +513,20 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager
* @throws TransactionSystemException if initialization failed * @throws TransactionSystemException if initialization failed
*/ */
protected void initTransactionSynchronizationRegistry() { protected void initTransactionSynchronizationRegistry() {
if (StringUtils.hasLength(this.transactionSynchronizationRegistryName)) { if (this.transactionSynchronizationRegistry == null) {
this.transactionSynchronizationRegistry = // Fetch JTA TransactionSynchronizationRegistry from JNDI, if necessary.
lookupTransactionSynchronizationRegistry(this.transactionSynchronizationRegistryName); if (StringUtils.hasLength(this.transactionSynchronizationRegistryName)) {
}
else {
this.transactionSynchronizationRegistry = retrieveTransactionSynchronizationRegistry();
if (this.transactionSynchronizationRegistry == null) {
this.transactionSynchronizationRegistry = this.transactionSynchronizationRegistry =
findTransactionSynchronizationRegistry(this.userTransaction, this.transactionManager); lookupTransactionSynchronizationRegistry(this.transactionSynchronizationRegistryName);
}
else {
this.transactionSynchronizationRegistry = retrieveTransactionSynchronizationRegistry();
if (this.transactionSynchronizationRegistry == null && this.autodetectTransactionSynchronizationRegistry) {
// Autodetect in JNDI if applicable, and check UserTransaction/TransactionManager
// object that implements TransactionSynchronizationRegistry otherwise.
this.transactionSynchronizationRegistry =
findTransactionSynchronizationRegistry(this.userTransaction, this.transactionManager);
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册