学习OSWORKFLOW(2.8)有一段时间,感觉就是个半成品,说明文档之类实在是太少了,只能靠自己一点点摸索,经过几天的研究终于有点头绪。
默认的 BasicWorkflow 类并不支持事务,而在OSWORKFLOW(2.8)中JDBC方式对数据的操作都是通过类 JDBCWorkflowStore 实现的,于是想要与现有系统结合做事务处理,就要在 JDBCWorkflowStore 类上做文章了。思路很简单,只要在 JDBCWorkflowStore 中建立一个 Connection 变量,添加一个 set方法,修改原来的 get 方法,最后就是屏蔽掉cleanup 函数中的内容,因为 cleanup 是关闭数据库连接的,如果不屏蔽则无法进行回滚了。JDBCWorkflowStore 修改具体代码如下:
//添加Connection变量
private static Connection connect = null;
………………
protected Connection getConnection() throws SQLException { //protected
closeConnWhenDone = true;
//System.out.println("test6=============="+connect);
return connect;
}
//新增链接设置函数
public void setConnection(Connection mConnect) throws SQLException { //protected
connect=mConnect;
}
而实际系统中需要进行事务处理的位置需要将Connection传给JDBCWorkflowStore中的Connection变量,就实现JDBC的事务处理了。调用代码如下,其中的sqlhelper为我自己建立的类,sqlconnection也是自己封装的数据库链接类,实际应用中可以用JDBC 的 Connection代替
public List AddWorkFlow(DBObject bo) throws Exception {
List mList = new ArrayList();
SqlConnection con = new SqlConnection(DBName);
con.beginTrance();
com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore mJDBC=new com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore();
mJDBC.setConnection(con.getConnection());
try {
//con.setAutoCommit(false);// 更改JDBC事务的默认提交方式
//System.out.println("41=============" + curUser.getLoginName());
Workflow wf = new BasicWorkflow(curUser.getLoginName());
long id = wf.initialize("example", 100, null);
//测试事务
// String sql = "INSERT INTO SYS_CONTRIL(ID,CTRLNAME,CTRLCONTENT) VALUES(?,?,?) ";
// PreparedStatement ps = con.prepareStatement(sql);
// ps.setInt(1, 2);
// ps.setString(2, "AA");
// ps.setString(3, "AA");
// ps.executeUpdate();
com.apps.SysManage.DAO.SYS_CONTRILDAO mDAO= new com.apps.SysManage.DAO.SYS_CONTRILDAO(con);
DBObject mbo=new DBObject();
mbo.set("CTRLNAME", "aa");
mbo.set("CTRLCONTENT", "aa");
String mID =mDAO.add(mbo, "ID");
System.out.println("4=============" + id+"==========="+mID);
if(1==1){
throw new Exception("cc============");
}
con.commitTrance();
return mList;
} catch (Exception e) {
con.rollTrance();
throw new Exception(e.getMessage());
} finally {
mList = null;
con.close();
}
}