Flowable源码地址:https://github.com/flowable/flowable-engine
Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
Spring事务,包路径:org.activiti.spring
TransactionContext 事务上下文接口
package org.activiti.engine.impl.cfg;
/**
* 事务上下文
*
* @author Tom Baeyens
*/
public interface TransactionContext {
// 提交
void commit();
// 回滚
void rollback();
void addTransactionListener(TransactionState transactionState, TransactionListener transactionListener);
}
SpringTransactionContext Spring事务
/**
* 将事务交给Spring管理
*
* @author Frederik Heremans
* @author Joram Barrez
*/
public class SpringTransactionContext implements TransactionContext {
protected PlatformTransactionManager transactionManager;
protected CommandContext commandContext;
protected Integer transactionSynchronizationAdapterOrder;
public SpringTransactionContext(PlatformTransactionManager transactionManager, CommandContext commandContext) {
this(transactionManager, commandContext, null);
}
public SpringTransactionContext(PlatformTransactionManager transactionManager, CommandContext commandContext, Integer transactionSynchronizationAdapterOrder) {
this.transactionManager = transactionManager;
this.commandContext = commandContext;
if (transactionSynchronizationAdapterOrder != null) {
this.transactionSynchronizationAdapterOrder = transactionSynchronizationAdapterOrder;
} else {
// 恢复到默认值,这是一个很高的数字,因为添加订单之前的行为会将TransactionSynchronizationAdapter
// 设置为在所有实现Ordered的适配器之后调用
this.transactionSynchronizationAdapterOrder = Integer.MAX_VALUE;
}
}
@Override
public void commit() {
// 什么都不做,事务由spring管理
}
@Override
public void rollback() {
// 为了防止回滚不是由异常触发的,我们将当前事务标记为rollBackOnly。
transactionManager.getTransaction(null).setRollbackOnly();
}
@Override
public void addTransactionListener(final TransactionState transactionState, final TransactionListener transactionListener) {
if (transactionState == TransactionState.COMMITTING) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void beforeCommit(boolean readOnly) {
transactionListener.execute(commandContext);
}
});
} else if (transactionState == TransactionState.COMMITTED) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
transactionListener.execute(commandContext);
}
});
} else if (transactionState == TransactionState.ROLLINGBACK) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void beforeCompletion() {
transactionListener.execute(commandContext);
}
});
} else if (transactionState == TransactionState.ROLLED_BACK) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCompletion(int status) {
if (TransactionSynchronization.STATUS_ROLLED_BACK == status) {
transactionListener.execute(commandContext);
}
}
});
}
}
protected abstract class TransactionSynchronizationAdapter implements TransactionSynchronization, Ordered {
@Override
public void suspend() {
}
@Override
public void resume() {
}
@Override
public void flush() {
}
@Override
public void beforeCommit(boolean readOnly) {
}
@Override
public void beforeCompletion() {
}
@Override
public void afterCommit() {
}
@Override
public void afterCompletion(int status) {
}
@Override
public int getOrder() {
return transactionSynchronizationAdapterOrder;
}
}
}