snakerflow教程文档

发布时间 : 星期五 文章snakerflow教程文档更新完毕开始阅读

一、snakerflow工作流概述

1、Snakerflow工作流运作机制,其实就是围绕7张核心的增删改查进行运作。

1)首先你需要定义一个流程文件也就是*.snaker文件,这个文件是对流程的描述。 2)部署流程文件*.snaker,也就是在数据库中对wf_process新增一条记录,其中表wf_process的content字段就是存的流程文件内容。这表中的一条记录相当于一个模板,所有的流程实例都已据此生成。

3)启动一个流程,也就是我们所说的生成一个流程实例;生成时要指定wf_process表的一条记录的ID。启动成功后会在数据库中wf_order和wf_hist_order表中分别插入一条记录,两个表的ID是相同的,不带hist的表都是存储当前有效(执行中)的记录。带hist是存储的结束的(下同)。wf_hist_order比wf_order表多一个字段order_state,用来表示该流程实例是否已经结束,1进行中;0结束。所有字段的含义和枚举值都在源码bean中有解释。(下同)。Order表中variable字段存的是该流程实例的全局变量,你可以在任何节点的时候获取使用。

4)执行节点的任务A2,上述中wf_task存的是执行中的记录,也就是说在执行A2前,wf_task中肯定会有一条执行中的任务记录,假设为A1,那么执行A2时的增删改为先将wf_task和wf_task_actor表中A1的记录插入wf_hist_task和wf_hist_task_actor中;其次是删除wf_task和wf_task_actor中A1记录,然后将A2的信息插入到wf_task和wf_task_actor中。此时wf_task表的parent_task_id是历史表A2记录的Id,通过此可将所有任务串联起来。task表的variable中的值为局部变量只能在当前task中使用。有人会有疑问,假设有如下流程图,执行task1时会怎么样?

因为开始节点是一个比较特殊的nodemodel,群主称之为流转逻辑元素(下面总体设计思路中会有详细介绍),它只负责流转到下一节点不负责执行,也就没有数据库的增删改。这样直接流转到task1,插入wf_hist_task和wf_hist_task_actor,并且又直接流转到end节点,end节点也是一个流转元素,它会直接删除wf_order表的记录并更改该流程实例wf_hist_order表的order_state的状态。

至此一个流程的所有增删改查结束。

二、snakerflow工作流执行过程

此处结合源码分析整个执行过程:

1、工作流的入口类,是你在配置文件中配置SnakerEngine的实现类。比如集成spring你需要配置如下内容

该入口类包含5大服务和一个配置解析类

从上图可知,流程引擎SnakerEngine对象是由Configuration根据snaker.xml构建所得,并且包含五项服务:

1)ProcessService:负责部署、卸载、更新流程,并且可创建无流程定义的自由流程 2)OrderService:负责创建、更新、完成、终止流程实例 3)TaskService:负责创建、完成任务,并且可创建自由任务 4)ManagerService:负责提供与流程相关的管理服务 5)QueryService:负责与流程相关的查询操作

对于不使用其他框架IOC容器创建对象,就像上面所述流程引擎SnakerEngine对象是由Configuration根据snaker.xml构建所得,其他服务也配置在snaker.xml中,我们称之非托管容器,即所有对象的创建由snaker自身创建。如何做到的?说白了就是把类名存到内存map中需要的时候反射创建出一个对象来。

对于托管型容器,比如交给spring的ioc来创建对象,那么就应该在spring的配置文件里定义了。

1)不依赖其他框架时,入口类定义的是

用到的创建对象ioc容器是

如何构建流程引擎

Parser方法往下都是从ioc容器中创建五大服务对象,关键是parser方法都干了什么。

读取了几个配置文件,isCMB就是判断是否是容器托管,就是是否使用snaker自身的ioc容器。

联系合同范文客服:xxxxx#qq.com(#替换为@)