WorkFlow的事务回滚实现

Workflow Project 目前状态
版本 0.11

已经完成
1。完成了接口1 和接口2 的方法
2。完成接口3的默认实现
3。完成事务回滚的实现方法-等待测试

未完成
1。接口3的注册与实例化解决方案
2。应用的并发访问问题以及解决数据的脏读问题
3。与具体的某个应用挂接并测试


-事务的回滚
OSWorkFlow的事务回滚是依靠WorkflowContext这个接口来实现的,在New出某个WorkFlow的时候需要声明WorkflowContext的实现类,一般会采用uper.context = new GearWheelWorkFlowContext(_caller);方法
比如这样实现:

public GearWheelWorkFlow(String _caller)
{
super.context = new GearWheelWorkFlowContext(_caller);
}

但OSWorkFlow的WorkflowContext的默认实现BasicWorkFlowContext中根本没有实现setRollbackOnly方法,也就没有了参考的可能

再看看这个接口的其他实现类也都是建立在JTA这样的跨Session的事务服务上,比如它的EJB的实现也是要调用容器提供的JTA实现才行!而JTA的实现比如要JNDI到数据库池,此时的应用光JTA+JNDI就已经宣布 -这样的例子必须生存在应用服务器的环境下!!

可是,我不死心,我记得Hibernate可以实现本地事务,也就是依靠JDBC本身的事务处理能力,而要实现这样的功能就需要在数据库连接的获取上下一些功夫,也就是要保证回滚的数据库连接必须是获取时的那个连接,而存储连接就成了一个需要首先解决的问题。

解决数据库连接的存储问题
目前存储数据库连接除了依靠静态类外,还有一个通用的方法ThreadLocal类,这样获取数据库连接的方法写成了如下的形式:

package com.company.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
public class DB2ConnectFactory
{
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(DB2ConnectFactory.class);
private static ThreadLocal threadLocal = new ThreadLocal();
//~
private Connection connect = null;
private Statement state = null;
private ResultSet result = null;
private boolean closeConnWhenDone = false;
//~
private String url = "jdbc:db2:WORKFLOW";
private String user = "";
private String password = "";
private String driverClassName = "COM.ibm.db2.jdbc.app.DB2Driver";

public DB2ConnectFactory() throws SQLException
{
this.init();
}

/**
* 获取数据库连接
* @return
* @throws SQLException
*/
public Connection getConn() throws SQLException
{
return (Connection)threadLocal.get();
}

/**
* 初始化数据库,并在缓冲中注册数据库连接
* @throws SQLException
*/
private void init() throws SQLException
{
try
{
// Get connect object
Class.forName(driverClassName);
closeConnWhenDone = true;

connect = DriverManager.getConnection(url, user, password);
state = connect.createStatement();

//Register the connection object in the threadlocal
threadLocal.set(connect);
}
catch (Exception e)
{
e.printStackTrace();
throw new SQLException(e.getMessage());
}
}

}

解决事务回滚
刚才说了需要实现WorkflowContext接口
package com.company.engine.workflow;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import com.company.common.DB2ConnectFactory;
import com.opensymphony.workflow.WorkflowContext;
public class GearWheelWorkFlowContext implements WorkflowContext
{
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(GearWheelWorkFlowContext.class);

private static ThreadLocal threadLocal = new ThreadLocal();

// ~ Instance fields
//
private String caller;
// ~ Constructors
// ///
public GearWheelWorkFlowContext(String caller)
{
this.caller = caller;
}
// ~ Methods
//
public String getCaller()
{
return this.caller;
}
/**
* Tranaction : Set Roll back
* @throws SQLException
*/
public void setRollbackOnly()
{
Connection connect = null;
try
{
DB2ConnectFactory factory = new DB2ConnectFactory();
connect = factory.getConn();
if(connect != null) connect.rollback();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
this.clostConnection(connect);
}
}

private void clostConnection(Connection connect)
{
try
{
if(connect != null) connect.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

总结
1。我们可以看到由于接口中setRollbackOnly没有异常的声明,方法中即使抛出了异常也要自己"忍了"!看来良好的接口声明其实是非常重要的。

2。而且需要重载原来JDBCWorkflow 中的cleanup方法,将其中的代码屏蔽掉!数据库的关闭放在了setRollbackOnly访访的finally中,原因就是由于我们要统一的管理数据库连接所引发的,我们不能够在WorkFlowStore的每一个方法执行完毕后就关闭连接,因为这样的话你根本没有了事务回滚的可能,所以此时的连接需要在WorkflowContext中来处理。


感触
OSWorkFlow的实现方法并不是像网上所说的那样的优秀和文雅,更像是一个未完成任务的"半成品",Heni被网上鼓吹为大牛,但一个不写注释和文档的人,根本称不上什么大牛!
OSWorkFlow更多的是实现了一个微内核,而它的用户模式是与OSUser这样的框架耦合的(偶已经将这样的耦合打开了,也就是接口3的定义),它的相关数据是与PropertySet框架耦合的(也就是接口2的定义),而且采用OSWorkFlow要经过很原始的修改(比如我实现了DB2下的WorkFlowStore的实现)。

不过也好即使以后不采用OSWorkFlow,自己实现一个这样的引擎也应该没有什么问题的,有时间了我倒是很想看看别的工作流的产品。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
workflow模式是一种将复杂业务流程分解为一系列相互关联的任务或步骤的方法。它通常用于管理和协调复杂的业务流程,可以帮助组织优化和提高业务流程的效率和可靠性。workflow模式的核心是定义和执行一系列任务以及规定任务之间的关系和依赖。 分布式事务是指涉及多个独立计算机节点的事务处理过程。在分布式系统中,将一个业务操作分为多个子操作,这些子操作可以在不同的计算机节点上并行执行。分布式事务的目标是确保在系统的各个节点上执行的所有子操作都能够同时成功或同时失败。 在分布式系统中实现分布式事务需要解决一些特殊的挑战,例如数据一致性和并发控制。常见的分布式事务处理模式包括两阶段提交和补偿事务模式。 两阶段提交(2PC)是一种分布式事务处理模式,它通过一个协调者节点来管理分布式事务的执行。2PC将事务执行过程分为准备阶段和提交阶段。在准备阶段,协调者节点将询问所有参与者节点是否准备好进行提交操作。如果所有参与者节点都准备好,协调者节点发送提交命令,否则发送回滚命令。 补偿事务模式(Compensating Transaction)是一种在分布式系统中处理事务的并发和错误情况的模式。当一个分布式事务发生错误或被取消时,补偿事务模式通过执行逆操作来回滚已经执行的操作,使系统恢复到原始状态。补偿事务模式可以通过设计逆操作来保持系统的一致性。 总而言之,workflow模式可以用来管理复杂的业务流程,而分布式事务可以保证在分布式系统中执行的各个子操作的一致性。在实现分布式事务时,常用的模式包括两阶段提交和补偿事务模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值