#1245 - Refactor internals - move TransactionMangerScope to be part of TransactionManager

This commit is contained in:
Rob Bygrave committed 2018-01-31 11:30:11 +13:00
1 parent 6b01821623
commit 5bd7853ce8
7 files changed
+106 -43

No files matched your search

@@ -8,8 +8,13 @@ import io.ebeaninternal.api.SpiTransaction;
public class DefaultTransactionScopeManager extends TransactionScopeManager {
public DefaultTransactionScopeManager(TransactionManager transactionManager) {
super(transactionManager);
public DefaultTransactionScopeManager(String serverName) {
super(serverName);
}
@Override
public void register(TransactionManager manager) {
// do nothing
}
@Override
@@ -23,7 +28,7 @@ public class DefaultTransactionScopeManager extends TransactionScopeManager {
}
@Override
public SpiTransaction getScoped() {
public SpiTransaction getMaybeInactive() {
return DefaultTransactionThreadLocal.get(serverName);
}
@@ -8,18 +8,21 @@ import io.ebeaninternal.api.SpiTransaction;
*/
public class ExternalTransactionScopeManager extends TransactionScopeManager {
final ExternalTransactionManager externalManager;
private final ExternalTransactionManager externalManager;
/**
* Instantiates transaction scope manager.
*
* @param transactionManager the transaction manager
*/
public ExternalTransactionScopeManager(TransactionManager transactionManager, ExternalTransactionManager externalManager) {
super(transactionManager);
public ExternalTransactionScopeManager(String serverName, ExternalTransactionManager externalManager) {
super(serverName);
this.externalManager = externalManager;
}
@Override
public void register(TransactionManager manager) {
externalManager.setTransactionManager(manager);
}
@Override
public void commit() {
DefaultTransactionThreadLocal.commit(serverName);
@@ -32,7 +35,7 @@ public class ExternalTransactionScopeManager extends TransactionScopeManager {
}
@Override
public SpiTransaction getScoped() {
public SpiTransaction getMaybeInactive() {
return get();
}
@@ -9,6 +9,7 @@ import io.ebean.event.changelog.ChangeLogListener;
import io.ebean.event.changelog.ChangeLogPrepare;
import io.ebean.event.changelog.ChangeSet;
import io.ebean.meta.MetaTimedMetric;
import io.ebeaninternal.api.ScopedTransaction;
import io.ebeaninternal.api.SpiProfileHandler;
import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.api.TransactionEvent;
@@ -124,6 +125,7 @@ public class TransactionManager {
private final TimedMetric txnMain;
private final TimedMetric txnReadOnly;
private final TimedMetricMap txnNamed;
private final TransactionScopeManager scopeManager;
/**
* Create the TransactionManager
@@ -142,6 +144,7 @@ public class TransactionManager {
this.changeLogAsync = options.config.isChangeLogAsync();
this.clusterManager = options.clusterManager;
this.serverName = options.config.getName();
this.scopeManager = options.scopeManager;
this.backgroundExecutor = options.backgroundExecutor;
this.dataSourceSupplier = options.dataSourceSupplier;
this.docStoreActive = options.config.getDocStoreConfig().isActive();
@@ -158,6 +161,50 @@ public class TransactionManager {
this.txnMain = metricFactory.createTimedMetric("txn.main");
this.txnReadOnly = metricFactory.createTimedMetric("txn.readonly");
this.txnNamed = metricFactory.createTimedMetricMap("txn.named.");
scopeManager.register(this);
}
/**
* Create a new scoped transaction.
*/
public ScopedTransaction createScopedTransaction() {
return new ScopedTransaction(scopeManager);
}
/**
* Return the scope manager.
*/
public TransactionScopeManager scope() {
return scopeManager;
}
/**
* Set the transaction onto the scope.
*/
public void set(SpiTransaction txn) {
scopeManager.set(txn);
}
/**
* Return the current active transaction.
*/
public SpiTransaction get() {
return scopeManager.get();
}
/**
* Return the current active transaction as a scoped transaction.
*/
public ScopedTransaction getScoped() {
return (ScopedTransaction) scopeManager.get();
}
/**
* Return the current scoped transaction allowing it to be inactive (already committed or rolled back).
*/
public ScopedTransaction getMaybeInactive() {
return (ScopedTransaction)scopeManager.getMaybeInactive();
}
/**
@@ -478,4 +525,13 @@ public class TransactionManager {
return list;
}
/**
* Begin an implicit transaction.
*/
public SpiTransaction beginServerTransaction() {
SpiTransaction t = createTransaction(0, false, -1);
scopeManager.set(t);
return t;
}
}
@@ -21,13 +21,15 @@ public class TransactionManagerOptions {
final BeanDescriptorManager descMgr;
final DataSourceSupplier dataSourceSupplier;
final SpiProfileHandler profileHandler;
final TransactionScopeManager scopeManager;
public TransactionManagerOptions(boolean localL2Caching, ServerConfig config, ClusterManager clusterManager,
BackgroundExecutor backgroundExecutor, DocStoreUpdateProcessor docStoreUpdateProcessor,
BeanDescriptorManager descMgr, DataSourceSupplier dataSourceSupplier, SpiProfileHandler profileHandler) {
public TransactionManagerOptions(boolean localL2Caching, ServerConfig config, TransactionScopeManager scopeManager, ClusterManager clusterManager,
BackgroundExecutor backgroundExecutor, DocStoreUpdateProcessor docStoreUpdateProcessor,
BeanDescriptorManager descMgr, DataSourceSupplier dataSourceSupplier, SpiProfileHandler profileHandler) {
this.localL2Caching = localL2Caching;
this.config = config;
this.scopeManager = scopeManager;
this.clusterManager = clusterManager;
this.backgroundExecutor = backgroundExecutor;
this.docStoreUpdateProcessor = docStoreUpdateProcessor;
@@ -8,19 +8,21 @@ import io.ebeaninternal.api.SpiTransactionScopeManager;
*/
public abstract class TransactionScopeManager implements SpiTransactionScopeManager {
protected final TransactionManager transactionManager;
protected final String serverName;
public TransactionScopeManager(TransactionManager transactionManager) {
this.transactionManager = transactionManager;
this.serverName = transactionManager.getServerName();
public TransactionScopeManager(String serverName) {
this.serverName = serverName;
}
/**
* Register the transaction manager (for use by external transaction scopes).
*/
public abstract void register(TransactionManager manager);
/**
* Return the current Transaction allowing it to be inactive.
*/
public abstract SpiTransaction getScoped();
public abstract SpiTransaction getMaybeInactive();
/**
* Return the current Transaction for this serverName and Thread.