最近研究osworkflow, 觉得这个工作流框架很轻便灵活,但是只有osworkflow+spring+hibernate的实现,我在想,如果一个大型的工作流系统,数据非常多,岂不是不能用hibernate了?,于是我就照着Hibernate的实现做了一个 Jdbc的的spring实现,反正jdbc可以解决任何数据优化问题,
package com.opensymphony.workflow.spi.jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import org.springframework.beans.factory.InitializingBean; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; public class SpringJDBCWorkflowStore extends JDBCWorkflowStore implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { entryTable = "OS_WFENTRY"; entryId = "ID"; entryName = "NAME"; entryState = "STATE"; historyTable = "OS_HISTORYSTEP"; currentTable = "OS_CURRENTSTEP"; currentPrevTable = "OS_CURRENTSTEP_PREV"; historyPrevTable = "OS_HISTORYSTEP_PREV"; stepId = "ID"; stepEntryId = "ENTRY_ID"; stepStepId = "STEP_ID"; stepActionId = "ACTION_ID"; stepOwner = "OWNER"; stepCaller = "CALLER"; stepStartDate = "START_DATE"; stepFinishDate = "FINISH_DATE"; stepDueDate = "DUE_DATE"; stepStatus = "STATUS"; stepPreviousId = "PREVIOUS_ID"; } public void setDataSource(DataSource dataSource){ this.ds = dataSource; } public DataSource getDataSource(){ return this.ds; } @Override protected Connection getConnection() throws SQLException { return DataSourceUtils.getConnection(this.ds); } @Override protected void cleanup(Connection connection, Statement statement, ResultSet result) { JdbcUtils.closeStatement(statement); JdbcUtils.closeResultSet(result); DataSourceUtils.releaseConnection(connection, this.ds); } public void setEntrySequence(String entrySequence){ this.entrySequence = entrySequence; } public void setStepSequence(String stepSequence){ this.stepSequence = stepSequence; } }
数据库的连接是基于JdbcTemplate的,好处就是可以很方便的和spring的事务框架整合(备注:如果想要用spring的事务管理,必须使用JdbcTemplate,原因是Spring的事务管理的数据库连接是从ConnHolder中取的,JdbcTemplate的数据库连接也是从ConnHolder中取的),这样使得osworkflow带入事务管理特性
Spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <description>数据源spring配置</description> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>123</value> </property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="workflowStore" class="com.opensymphony.workflow.spi.jdbc.SpringJDBCWorkflowStore"> <property name="dataSource" ref="dataSource"></property> <property name="entrySequence"> <value>select count(*) + 1 from os_wfentry</value> </property> <property name="stepSequence"> <value>select sum(c1) + 1 from (select 1 as tb, count(id) as c1 from os_currentstep union select 2 as tb, count(id) as c1 from os_historystep) as TabelaFinal</value> </property> </bean> <bean id="workflowTypeResolver" class="com.opensymphony.workflow.util.SpringTypeResolver"/> <bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init"> <property name="resource"><value>workflows.xml</value></property> <property name="reload"><value>false</value></property> </bean> <bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration"> <property name="store"><ref local="workflowStore"/></property> <property name="factory"><ref local="workflowFactory"/></property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"><ref local="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED,-Exception</prop> </props> </property> </bean> <bean id="workflow" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="singleton"> <value>false</value> </property> <property name="proxyInterfaces"> <value>com.opensymphony.workflow.Workflow</value> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> <property name="target" ref="workflowTarget"></property> </bean> <bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow" singleton="false"> <property name="configuration"><ref local="osworkflowConfiguration"/></property> <constructor-arg> <value>test2</value> </constructor-arg> </bean> </beans>
附件里面的例子是基于Iteye里面某位同学的例子改的,只不过我整合了spring和事务,谢谢这位同学的贡献,lib没有传上来,因为有点大,需要spring的lib和osworkflow的lib,这些都可以在网上下载到
相关推荐
osworkflow中文入门指南,osworkflow+hibernate+spring集成配置,osworkflow-2.8.0.jar
按照网上的文章将例子写了出来,网上的文章错误好多啊,依赖包也没有啊,我自己参考多篇文章终于搞出来了,可以运行!!
博文链接:https://andrawu.iteye.com/blog/37031
该例子有问题,请勿下载, 不知道如何删除
根据本人项目经验,编写的一个完整的Struts2+Spring+hibernate+OSworkflow 框架,包括完整的数据库脚本,直接可以用于项目开发了
spring+hibernate+osworkflow,服务器为Tomcat6.0,数据库为Mysql 把viewlivegraph2.jsp改为viewlivegraph.jsp. 其中把wf的获得修改为 ApplicationContext cxt = WebApplicationContextUtils.get...
OSWorkflow基于JDBC(oracle)存储实现的表结构OSWorkflow基于JDBC(oracle)存储实现的表结构
osworkflow指导文档 + 源码 + 参考资料全
OSWorkflow中文手册+开发指南,包括了OSWorkflow的官方例子。
OSWorkflow
从javaeye上下载别人的例子,感觉不错 另外在这里有详细介绍 http://www.javaeye.com/topic/100499?page=1
OSWorkFlow demo 资料 OSWorkFlow demo 资料
LIFERAY 中应用 JAVA WEB START 访问 OSWORKFLOW的简单设计器 的 portlet
OSWorkflow中文手册OSWorkflow中文手册OSWorkflow中文手册OSWorkflow中文手册 pdf 50页
笔者主持的开源工作流引擎AgileFlow就是基于ww2+spring+hibernate架构实现的。写到这里我想是不是它可以和struts2进行完美整合?! Jflow是从ccflow演化而来的国产工作流引擎,富有太多的业务场景设置。 Ccflow是...
基于osworkflow框架的OA系统demo osworkflow会议室使用申请DEMO