`
z7swf
  • 浏览: 186005 次
社区版块
存档分类
最新评论

OSWorkflow之四——流程开发

 
阅读更多

开始一个流程

我们通过XML完成的只是流程的定义,真正需要流程跑起来,我们还需要一个个流程的实例。

 

Workflow 接口

OSWorkflow最主要最常用的操作都是通过Workflow接口来完成的。OSWorkflow针对Ofbiz、EJB、XFireSOAP、OfbizSOAP都给出了自己的Workflow实现,我们可以根据场景选用。

 

BasicWorkflow

BasicWorkflow是我们在大多数场合下使用频率最高的Workflow实现。

 

initialize方法

通过initialize方法,我们可以创建属于我们自己的流程实例,完成一些初始化操作,并返回新创建的流程id。以下是initialize的方法签名:

 

/**
    * Initializes a workflow so that it can begin processing. A workflow must be initialized before it can
    * begin any sort of activity. It can only be initialized once.
    *
    * @param workflowName The workflow name to create and initialize an instance for
    * @param initialAction The initial step to start the workflow
    * @param inputs The inputs entered by the end-user
    * @throws InvalidRoleException if the user can't start this function
    * @throws InvalidInputException if a validator is specified and an input is invalid.
    * @throws InvalidActionException if the specified initial action is invalid for the specified workflow.
    */
    public long initialize(String workflowName, int initialAction, Map inputs) throws InvalidRoleException, InvalidInputException, WorkflowException, InvalidEntryStateException, InvalidActionException;

 

workflowName:我们在定义workflow是name属性的值,比如下例中的example,

 

<workflow name="example" type="resource" location="example.xml"/>
 

initialAction:我们在流程定义文件中定义的initialAction的id,比如下例中的100,

 

<initial-actions>
	<action id="100" name="Start Workflow">
		<pre-functions>
			<function type="class">
				<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
			</function>
		</pre-functions>
		<results>
			<unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
		</results>
	</action>
</initial-actions>
 

inputs:用来保存我们自己需要用到的一些key-value,他可以在action里的condition、function、validator中作为各自的方法参数传递,我们可以在相应的接口方法中轻易的读写。

 

以下是initialize方法的实例代码:

 

Workflow workflow = new BasicWorkflow("caller");
Configuration config = new DefaultConfiguration();
workflow.setConfiguration(config);
long workflowId = workflow.initialize("example", 100, null);
 

doAction方法

doAction方法用来执行一个动作行为,驱动着流程的运转。

 

/**
     * Perform an action on the specified workflow instance.
     * @param id The workflow instance id.
     * @param actionId The action id to perform (action id's are listed in the workflow descriptor).
     * @param inputs The inputs to the workflow instance.
     * @throws InvalidInputException if a validator is specified and an input is invalid.
     * @throws InvalidActionException if the action is invalid for the specified workflow
     * instance's current state.
     */
    public void doAction(long id, int actionId, Map inputs) throws InvalidInputException, WorkflowException;
 

参数:

 

id:workflow entity id 即实例id

actionId:action id

inputs:同initialize方法inputs参数。

 

getCurrentSteps方法

返回指定workflow实例的当前step对象的集合

 

/**
     * Returns a Collection of Step objects that are the current steps of the specified workflow instance.
     *
     * @param id The workflow instance id.
     * @return The steps that the workflow instance is currently in.
     */
    public List getCurrentSteps(long id);

参数:

id:workflow entity id 即实例id

 

getHistorySteps方法

返回指定workflow实例的当前历史step对象的集合

 

/**
     * Returns a list of all steps that are completed for the given workflow instance id.
     *
     * @param id The workflow instance id.
     * @return a List of Steps
     * @see com.opensymphony.workflow.spi.Step
     */
    public List getHistorySteps(long id);
 

参数:

id:workflow entity id 即实例id

 

action到底做了些什么

不论是initialize方法还是doAction方法,最后都会通过AbstractWorkflow的transitionWorkflow方法来完成流程流转的,下图是transitionWorkflow方法的执行步骤。

 


 

VariableResolver

VariableResolver接口只有一个translateVariables方法,OSWorkflow给出了一个默认实现DefaultVariableResolver。他负责将我们在XML流程定制文件中使用的类似“${var}”这样的占位符给替换成其具体的值。他首先会去transientVars中去找key=var的值,如果没有找到则会到propertySet去找。如此一来,我们就可以在XML文件中使用类似“${var}”这样的占位符,只要我们在之前把它们保存到transientVars或者propertySet就可以啦。

 

让OSWorkflow运行在Spring事务中

要让OSWorkflow和我们的应用运行在同一个事务中,前提是我们需要保证我们有相同的connection(JDBC)或者sessionFactory(hibernate),然后我们可以给Workflow 接口创建一个事务代理,当Workflow 接口的方法被执行时,可以加入到当前线程开启的事务中去,通过IOC容器这一切都变得那么简单。请参考以下红色部分的字体。

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="propertySetDelegate"
		class="com.opensymphony.workflow.spi.hibernate3.DefaultHibernatePropertySetDelegate">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>

	<bean id="workflowStore"
		class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
		<property name="propertySetDelegate">
			<ref bean="propertySetDelegate" />
		</property>
	</bean>

	<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>true</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="workflowTypeResolver" class="com.opensymphony.workflow.util.SpringTypeResolver">
	</bean>

	<bean id="basicWorkflow" class="com.opensymphony.workflow.basic.BasicWorkflow">
		<constructor-arg>
			<value></value>
		</constructor-arg>
		<property name="configuration">
			<ref local="osworkflowConfiguration" />
		</property>
		<property name="resolver">
			<ref local="workflowTypeResolver" />
		</property>
	</bean>


	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager">
			<ref bean="transactionManager" />
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="*">PROPAGATION_REQUIRED</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>
				<value>basicWorkflow</value>
			</list>
		</property>
	</bean>



	
</beans>
 

通过之前篇幅的探讨,我们的Spring Application Context应该如以上清单所示。如果使用Spring更高的版本,我们甚至可以通过其高级的特性来完成事务相关的配置,这些就不在此讨论范围之内啦。

 

OSWorkflow还有很多特性被我略过了,如对SOAP和EJB的相关支持,等等。对于没有提到的部分,大家也都可以一起分享探讨。

 

  • 大小: 105.7 KB
分享到:
评论

相关推荐

    OSWorkflow之三——workflow的推动者Action

    在这个主题“OSWorkflow之三——workflow的推动者Action”中,我们将深入理解如何使用Action来驱动workflow的执行,以及它在工作流中的核心作用。 Action在OSWorkflow中扮演着至关重要的角色,它是流程状态转换的...

    OSWorkflow——请假审批系统(代码全,数据库mysql)

    "OSWorkflow——请假审批系统(代码全,数据库mysql)" 指的是一个基于OSWorkflow工作流引擎实现的请假审批系统,该系统完整地提供了代码和数据库脚本,且数据库部分使用MySQL作为后台存储。 **描述解析:** 虽然描述...

    osworkflow开发指南

    在提供的两个PDF文档——"osworkflow-chinese-manual.pdf"和"OSWorkflow开发指南.pdf"中,你应该能找到关于这些知识点的详细解释和实例演示。它们将帮助你快速上手并深入理解osWorkFlow的工作原理和使用方法。记住,...

    工作流引擎 Osworkflow 及其持久化机制的研究

    此外,OSWorkflow还提供了一个全局变量——寄存器(Register)机制,用于在工作流运行过程中存储和传递数据。全局范围内的持久数据集称为属性集(PropertySet),通常存储在数据库中,对应于`os_propertyentry`表。...

    osworkflow_doc_cn_v2.0.pdf

    本文将深入解析一个独特而灵活的工作流引擎——OSWorkflow,通过分析其设计理念、核心组件及应用场景,帮助读者全面了解这一强大的工具。 ### OSWorkflow概览 OSWorkflow是一种开源的工作流管理系统,以其高度的...

    osworkflow-src

    "osworkflow-src" 是一个开源的工作流引擎——OSWorkflow的源码包,它主要用于实现业务流程的管理和控制。这个源码包提供了官方下载,意味着它包含完整的开发源代码,允许开发者深入理解其内部机制,进行定制化开发...

    osworkflow---提供osuser源碼

    标题中的“osworkflow---提供osuser源碼”指的是OSWorkflow框架的一个组成部分——osuser模块的源代码。OSWorkflow是一款开源的工作流引擎,它允许开发者在Java应用中实现复杂的业务流程。osuser模块则是该框架中...

    工作流最全的资料学习

    osworkflow-2.8.0.jar是一个开源的工作流引擎——OpenSymphony Workflow(OSWorkflow)的库文件。OSWorkflow是一款强大且灵活的Java工作流框架,它允许开发者自定义工作流定义,实现任务分配、状态转换和流程控制。...

    工作流各项对比.pdf

    本文将对四个主流的开源工作流引擎——Jbpm4、Activiti5、osworkflow和Shark进行详细对比,以便理解各自的特点和适用场景。 Jbpm4是一款基于Hibernate3的开源工作流引擎,它支持多种流程定义语言,如BPEL、XPDL、...

    程序员简历模板-张三丰个人简历.doc

    他还参与了综合积分系统、进件审批系统和评分决策系统的业务调研、需求分析、编码和接口设计,体现了他在银行业务理解和软件开发流程上的全面性。 在早期的工作经历中,张三丰在深圳市掌上科技有限公司负责出行易...

Global site tag (gtag.js) - Google Analytics