OSWorkflow

特点:没有好的可视化工具,2.8.0是最新的版本,但这已经是07年的版本。目前官网已经没有对他提供更新。原理:主要基于有限状态机(Finite state machine),将每一个状态描述成流程中的一个步骤。jar包:osworkflow、oscore、propertySet。

1、基本概念

工作流描述文件,一个xml文件。
wrokflow:一个根元素,代表了一个工作流。一般由多个step构成,step表示一个流程。
step:每一个步骤中可以有一个或者多个actionaction表示一个动作。每执行完一个步骤,就会走向下一个步骤。在不同的步骤之中流程的状态可以不断的改变,状态类别可以设置。
action:每一个动作可以有一个无条件结果unconditional result和零到多个conditional result条件结果。在result中指定完成之后的状态,并指定跳转的下一个步骤。
Image
Image
在beanshell 表达式范围内中始终存在三个变量,entry、context和store,分别是WorkflowEntry、WorkflowContext、WorkflowStore三个对象。beanshell是一种完全符合java语法的脚本语言,可以理解为可以在beanshell中编写java代码。

2、实现细节

1、配置数据库,这是你工作流中数据流转的数据库来源。可以选择xml配置模式。在传统的动态web工程的server.xml文件中,设置好数据库驱动。Tern将所有配置信息保存在Java代码中。
2、持久化(Persistence)。内置提供了:MemoryStore、SerializableStore、JDBCStore方式。也可以自己继承WorkflowStore接口,实现自己的需求。
3、载入流程定义文件(WorkflowFactory)
读取编写好的xml,将流程载入。可以继承AbstractWorkflowFactory来实现自己的需求。

3、Tern框架里实现

1、流程服务(Service.class)
Service用于定义好流程的ID,流程的名称 ,流程所关联的实体数据表名称。此处的流程不是指的具体的流程,而是指的一种流程。
主要的属性:流程ID,流程名称,流程描述,流程关联的实体数据(可以有实体类类名,也可以是该实体类在数据库中的表名)。
在后面新建立一个流程的时候都要通过这个类去获取一种流程,然后新增一个流程实例。
2、流程实例(Process.class)
Process用于定义一个具体的流程。也即是是通过Service生成的一个流程实例。
主要的属性:流程ID,流程服务ID,实体数据ID,流程描述,发起者ID,发起时间,结束时间,序列号,状态
3、工作流记录(WorkflowEntry.class)
WorkflowEntry用于定义描述一个工作流实例。
主要属性:工作流名称、工作流状态、是否已经初始化、id
在tern中对WorkflowEntry进行了扩展,增加了record(实体数据记录)、user(当前操作员)、service(该工作流对应的流程服务)、process(该工作流的流程实例)
WorkflowEntry的id在新建的时候被赋值为process的id
4、工作流持久化(WorkflowStore)
用于数据的持久化。tern扩展继承了JDBCWorkflowStore。主要的功能是负责管理流程的执行过程。
主要的功能函数:
findSteps去获取数据库中已经进行的流程步骤。可传入多种参数entryId,state
getNextEntrySequence获取下一步流程的序列号
createEntry新增一个WorkflowEntry实例
findCurrentSteps();findHistorySteps();createCurrentStep();
tern在数据库中建立了表wf_stepinfo,上面的方法都是对wf_stepinfo进行操作。
5、工作流工厂
主要的负责流程的定义方面。
WorkflowDescriptor在OSWorkflow中表示一个处理之后的流程
6、工作流引擎(Workflow.class)
tern实现了OSWorkflow提供的工作流引擎的接口。tern将工作流引擎设计为单例模式。引擎中设置了环境上下文(Context),里面存储了当前登录的操作员。引擎中持有了一个运行当前工作流的线程对象。
主要的功能函数:
(1)createInstance():创建工作流的实例,即通过Service和实体数据record创建一个流程。这一步会在数据库中
getAvailableActions():函数中根据WorkflowStoreIAPWorkflowEntryWorkflowDescriptor这三个对象,获取到当前步骤中可做的动作Actions
getPermissionHandler():根据传入的WorkflowDescriptor和工作流引擎中存储的操作员,可以判断出当前操作员的角色是否有权限参与流程
getCurrentSteps();getEntryState();getHistorySteps();:调用了WorkflowStore里面的方法
initialize():新增一个工作流条目,
changeEntryState():变更工作流条目的状态COMPLETED,CREATED,ACTIVATED,SUSPENDED,KILLED
doAction():做工作流里面的操作。entry、propertySet、transientVars这些变量可通过