最近一直忙于研究开源工作流osworkflow,该工作流还可以,虽然比起现在流行的jbpm来说暂时还是有一定的差距,主要表现在可视化GUI方面的差距上,但是jbmp是要jboss支持的,其可视化也是作为eclipse插件形式来应用的,所以对于没有采用jboss和eclipse的同志来说可能就不太方便,再者osworkflow的灵活性非常好。
在最近经常上网查关于osworkflow2.8的资料,但不管是官方提供的资料和实例,还是网上很多同事发布的资料(和多都只是对官方资料的翻译和直接应用),很少能够按其配置而能够运行的,特别是对采用spring架构而在持久层没有采用hibernate的人来说将很麻烦(本人采用的是ibatis,所以只能采用jdbc),其jdbcstore里面有depercation的方法,所以继承了之后编译也有问题,需要调整编译方式。再者直接采用spring+jdbc直接在applicationcontent里面配置的是后将更加麻烦,所以本人最后还是将其osworkflow的源文件编译之后添加到osworkflow2.8的jar里面,然后写了一个类继承jdbdstore类。
<bean id="workflowStore" class="com.framework.controller.MyJDBCWorkflowStore">
<property name="ds"><ref bean="dataSource"/></property>
<property name="entrySequence" value="SELECT seq_os_wfentry.nextVal from dual"/>
<property name="stepSequence" value="SELECT seq_os_currentsteps.nextVal from dual"/>
<property name="entryTable" value="OS_WFENTRY"/>
<property name="entryId" value="ID"/>
<property name="entryName" value="NAME"/>
<property name="entryState" value="STATE"/>
<property name="historyTable" value="OS_HISTORYSTEP"/>
<property name="currentTable" value="OS_CURRENTSTEP"/>
<property name="historyPrevTable" value="OS_HISTORYSTEP_PREV"/>
<property name="currentPrevTable" value="OS_CURRENTSTEP_PREV"/>
<property name="stepId" value="ID"/>
<property name="stepEntryId" value="ENTRY_ID"/>
<property name="stepStepId" value="STEP_ID"/>
<property name="stepActionId" value="ACTION_ID"/>
<property name="stepOwner" value="OWNER"/>
<property name="stepCaller" value="CALLER"/>
<property name="stepStartDate" value="START_DATE"/>
<property name="stepFinishDate" value="FINISH_DATE"/>
<property name="stepDueDate" value="DUE_DATE"/>
<property name="stepStatus" value="STATUS"/>
<property name="stepPreviousId" value="PREVIOUS_ID"/>
<!--<property name="jdbcPropertySet"><ref local="jdbcPropertySet"/></property>-->
</bean>
<property name="ds"><ref bean="dataSource"/></property>
<property name="entrySequence" value="SELECT seq_os_wfentry.nextVal from dual"/>
<property name="stepSequence" value="SELECT seq_os_currentsteps.nextVal from dual"/>
<property name="entryTable" value="OS_WFENTRY"/>
<property name="entryId" value="ID"/>
<property name="entryName" value="NAME"/>
<property name="entryState" value="STATE"/>
<property name="historyTable" value="OS_HISTORYSTEP"/>
<property name="currentTable" value="OS_CURRENTSTEP"/>
<property name="historyPrevTable" value="OS_HISTORYSTEP_PREV"/>
<property name="currentPrevTable" value="OS_CURRENTSTEP_PREV"/>
<property name="stepId" value="ID"/>
<property name="stepEntryId" value="ENTRY_ID"/>
<property name="stepStepId" value="STEP_ID"/>
<property name="stepActionId" value="ACTION_ID"/>
<property name="stepOwner" value="OWNER"/>
<property name="stepCaller" value="CALLER"/>
<property name="stepStartDate" value="START_DATE"/>
<property name="stepFinishDate" value="FINISH_DATE"/>
<property name="stepDueDate" value="DUE_DATE"/>
<property name="stepStatus" value="STATUS"/>
<property name="stepPreviousId" value="PREVIOUS_ID"/>
<!--<property name="jdbcPropertySet"><ref local="jdbcPropertySet"/></property>-->
</bean>
该bean是在spring里面配置jdbc的配置,里面的MyJDBCWorkflowStore类是我自己写的一个非常简单的类。该类继承自JDBCWorkflowStore。
<bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init">
<property name="resource"><value>workflow/workflows.xml</value></property>
<property name="reload"><value>true</value></property>
</bean>
<property name="resource"><value>workflow/workflows.xml</value></property>
<property name="reload"><value>true</value></property>
</bean>
该bean为osworkflow的factory。
<bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration">
<property name="store"><ref local="workflowStore"/></property>
<property name="factory"><ref local="workflowFactory"/></property>
</bean>
<property name="store"><ref local="workflowStore"/></property>
<property name="factory"><ref local="workflowFactory"/></property>
</bean>
该bean为osworkflow的configuration,configuration是osworkflow里面非常重要的组建。
<bean id="workflowTypeResolver" class="com.opensymphony.workflow.util.SpringTypeResolver">
</bean>
</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>
<value>workflowTarget</value>
</list>
</property>
</bean>
<property name="singleton">
<value>false</value>
</property>
<property name="proxyInterfaces">
<value>com.opensymphony.workflow.Workflow</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<value>workflowTarget</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!--定义事务管理的拦截器-->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="*Transaction">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="*Transaction">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow" singleton="false">
<constructor-arg><value>test</value></constructor-arg>
<property name="configuration"><ref local="osworkflowConfiguration"/></property>
<property name="resolver"><ref local="workflowTypeResolver"/></property>
</bean>
<constructor-arg><value>test</value></constructor-arg>
<property name="configuration"><ref local="osworkflowConfiguration"/></property>
<property name="resolver"><ref local="workflowTypeResolver"/></property>
</bean>
其他的这几个bean只是几个非常简单的配置,只要用过spring框架及其aop代理的人应该都知道,在这里就不再介绍了。
其次,大家需要注意的就是osuser.xml和持久化的propertyset.xml一定要放在classes里面,而不能放在classes里面的子文件夹。
配置好了之后其他的都和官方自带的东西一样。不过在osworkflow2.8带的例子里面用户登录注册的user和group之间没有联系,所以不能直接应用。