在Workflow事务回滚中遇到了问题,是这样的
DB2ConnectFactory 中getConn方法
/**
* 获取数据库连接
* @return
* @throws SQLException
*/
public Connection getConn() throws SQLException
{
Object obj = threadLocal.get();
if(obj == null)
{
this.initFactoryStack();
}else
{
connect = (Connection)obj;
}
connect.setAutoCommit(false); //事务的回滚必须建立在将Commit状态为False下,默认是true
logger.debug("Get connect from factory - " + connect.hashCode());
return connect;
}
AbstractWorkflow 的doAction()方法
try {
//transition the workflow, if it wasn't explicitly finished, check for an implicit finish
if (!transitionWorkflow(entry, currentSteps, store, wf, action, transientVars, inputs, ps)) {
checkImplicitFinish(id);
}
} catch (WorkflowException e) {
context.setRollbackOnly(); // 这里调用WorkContext对象的setRollbackOnly()方法,执行事务的回滚
throw e;
}
GearWheelWorkFlowContext 的setRollbackOnly方法
/**
* Tranaction : Set Roll back
* @throws SQLException
*/
public void setRollbackOnly()
{
logger.debug("Context execute setRollbackOnly() !!");
Connection connect = null;
try
{
DB2ConnectFactory factory = new DB2ConnectFactory();
connect = factory.getConn();
logger.debug("Context get connect " + connect.hashCode());
if(connect != null) connect.rollback();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
this.clostConnection(connect); //这里将关闭数据库连接
}
}
可是这是"异常"情况下的处理流程,如果正常执行呢?
刚开始我想写在CleanUp()方法里,但又一想不行,因为正常执行的流程需要做两个工作
1。将Commit状态更新为true,并提交连接
2。关闭数据库连接
关键就是关闭数据库的连接在哪里写?!现在写在CleanUp()不合适,因为每一个WorkStore的方法都要默认(程序已经写死了,我可不想重载它的所有的方法!!)的关闭数据库连接!
仔细的分析了一下,其实有两个方法可以做到
1。编写Proxy类
2。重载所有AbstractWorkflow中设计到事务的方法,(本来可以重载transitionWorkflow但是方法的类型却为private?!)在它的方法下增加一个"提交"的方法。比如这样
try {
//transition the workflow, if it wasn't explicitly finished, check for an implicit finish
if (!transitionWorkflow(entry, currentSteps, store, wf, action, transientVars, inputs, ps))
{
checkImplicitFinish(id);
}
dosubmit();
} catch (WorkflowException e) {
context.setRollbackOnly(); // 这里调用WorkContext对象的setRollbackOnly()方法,执行事务的回滚
throw e;
}
可以看到方法2比较"烂",看来下一步即使编写方法1的实现