工作流参考手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章总体说明
在使用EOS WorkFlow的过程中,无论是开发者在“开发环境”中定义业务流程,还是“工作流引擎”控制流程流转,或是工作流参与者使用的“客户端”,再或者管理员使用的“管理与监控工具”,在这期间都会贯穿EOS Workflow 的5个主要对象——流程定义、活动定义、流程实例、活动实例以及工作项。
1.1 概念说明
流程定义:描述一个完整的业务过程,它由若干活动组成。
包括了流程的基本信息、流程的开始和结束条件、组成的活动、活动间流转的规则、需要用户执行的工作任务(工作项)、可能调用的应用程序以及流程相关数据等信息。
提交到流程定义库(WFProcessDefine)后会包含流程定义ID(流程定义的唯一标识)、流程定义名称、版本号、流程定义描述以及提交时间等描述。
活动定义:包含在流程定义之中,代表了一个相对独立的、逻辑的工作单元。
一个活动代表一个需要由相关资源处理,或者由计算机处理的任务。
其中定义了该活动的基本信息、执行该活动的参与者、时间限制、工作项信息、触发事件、启动策略等信息。
流程实例:当流程定义提交、发布到服务器以后,就可以启动该流程,启动时会创建流程定义的一个实例,叫流程实例。
同一个流程定义可以有多个流程实例。
每一个流程实例会被保存在流程实例库(WFProcessInst)中,包括流程实例ID(唯一标识)、流程实例名称、流程定义ID、流程实例的状态、该实例的启动者、启动时间、相关数据等信息。
活动实例:流程实例中的每个活动称为活动实例。
每一个活动实例会被保存在活动实例库(WFActivityInst)中,包括活动实例ID(唯一标识)、活动实例的状态、所属的活动定义ID以及流程实例ID、时间限制、是否超时、创建时间等信息。
工作项:表示流程实例在流转过程中为完成某个活动实例所要参与者做的工作。
一个活动实例可以对应一个或多个工作项。
每个工作项会被保存在工作项库(WFWorkItem)中,包括工作项ID(唯一标识)、参与者ID、工作项的状态、所属的活动实例ID,流程实例ID等信息。
对象间的主要关系
流程定义和活动定义是在工作流开发阶段所确定;流程实例、活动实例和工作项则是在工作流运行阶段确定。
一个流程定义由多个活动定义组成。
一个流程定义可以创建多个流程实例。
一个流程实例包含多个活动实例,每个活动实例可以包含一个或多个工作项在一些特定的情况下(比如,一个活动要循环执行多次),一个活动定义会存在多个活动实例
具体如下图所示:
1.2 相关配置说明
以下是一些有用的配置说明,关于EOS工作流的具体配置说明请参考附录—〉配置文件wfconfig.xml。
工作流数据连结的配置在哪里
在config/eosconfig.xml文件中的module name="workflow" group name="database"中,指定了工作流的包名称和unitID。
通过包名称及unitID 就可以从EOSEJBREGISTER表中获得数据库连接的DATASOURCE和IP地址。
带有工作流的EOS应用一定要采用数据源的方式(配置了数据源与连接池,且eosconfig.xml文件中single值为false)连接数据库,这样才能保证工作流和业务系统中事务的完整性。
而且工作流调度引擎需要连接池来处理对数据库的并发控制,不能使用JDBC直接连接,否则在实际的使用中会出现并发控制错误。
例如:使用EOS5.0,在工作流客户端的“我的任务->待执行的工作任务”执行一个待执行的工作项,该工作项的任务是调用一个人工活动去查一张表。
如果在studio中启动项目server,功能一切正常,如果启动外部server,这个功能有时候正常,有时候出错,出错页面的截图和详细的log见附件!(注:出错是不确定的,有时候连续好几次都报错,有时候连续好几次都对!)在编写工作流的业务自动机(业务逻辑)中,相关的工作流操作(如:完成工作流节点,回退,设置工作流的相关数据等操作)和外部的业务操作都要并在一个transaction (事务)中。
工作流历史表的相关说明
EOS数据库中存在以WF_H开头的几张表,这是工作流历史表,分别对应了流程实例、活动项实例、工作项实例等等,业务上经常需要通过这些历史数据进行统计分析,至于什么时候进行记录备份,帮助文档中没有提到。
其实,在EOS系统配置文件wfconfig.xml中,定义了历史记录备份的策略,如下:
<group name="trans_history">
<!--转移历史的策略:可能的值 TIME_BASED(固定时间转移)|ON_FINISH(流程实例结束时转移)|NEVER(不转移)|ON_START(系统启动时候转移)--> <configValue key="trans_strategy">TIME_BASED</configValue>
<!--转移时间点列表:当trans_strategy配置为TIME_BASED时候有效。
表示转移到历史表的时间,格式示例:1:00,2:00,8:18-->
<configValue key="time_list">0:30,5:00</configValue>
</group>
第2章建模过程
EOS Studio提供了可视化的开发环境来定义工作流业务流程模型,提供串行、分支、并行、聚合、循环、同步、子流程等丰富的流程逻辑结构,以及人工活动、自动活动、路由活动等多种活动类型,并可对这些活动属性进行定义,如参与者类型、触发事件、子流程属性、时间限制、回退动作、多工作项等,定义属性时可选择不同的数据类型、可灵活的扩展活动;可以通过表单数据为活动节点设置动态表单,其表单数据实现了动态表单的编辑,为日常工作中表单的定制提供了良好的设计工具。
2.1 流程定义
流程定义由流程属性、活动属性、连接线三部分构成。
开发者可以根据实际中的业务需要设置流程上的基本属性、触发事件、时间限制以及流程启动者。
对每一个具体的活动则可根据实际情况设定其运行的方式、参与者以及调用的应用等信息。
完成流程定义的描述后即可提交、发布。
提交后的流程将生成XML格式的流程定义文件,存入流程定义库中
2.1.1流程版本
版本号的产生方式如下:
1、开发人员指定
版本号的格式为:X.Y.Z (其中X>0;Y:0-99;Z:0-99) ,若指定的版本在流程定义库中不存在,则按指定的版本号生成新版本。
若指定的版本在流程定义库中存在,则覆盖流程定义库中已有的版本。
例如,某流程在流程定义库中存在1.1.1和1.2.3两个版本。
若要提交第三个版本,开发人员指定新版本号1.1.2,那么该流程提交流程定义库的版本号即为1.1.2;若指定版本号为1.1.1,则该流程在提交流程定义库时会覆盖原有1.1.1版本的流程
2、自动生成新版本
获取流程定义库中同一流程的最大版本,并在此基础上"加1"作为当前流程的版本号。
2.1.2触发事件
2.1.2.1 触发事件说明
流程触发事件表示按照流程定义中的设置流程实例在运行到某个阶段所需
要工作流引擎做某种类型的某个动作。
“某个阶段”即为事件的触发时机,“某种类型”即为事件类型,“某个动作”即为事件的动作。
触发时机:表示指定的事件动作在何时触发。
EOS WorkFlow提供了创建、动、结束、超时和提醒5个触发时机。
创建:表示指定的事件在流程实例创建时触发。
此时流程实例实际上处于“待启动”的状态,并没有合适的活动实例产生。
简言之,流程实例此时只是做好运行的准备,但未真正开始运行。
例如:把田径比赛中的110米栏比作流程实例,那么创建时的流程实例就相当于已站在助跑器前的运动员们等待发令枪响的那一刻。
启动:表示指定的事件在流程实例启动时触发。
此时,流程实例已真正处于运行状态了,流程实例已开始运行,各活动实例将会相继产生。
例如:流程实例此时的状态若比作110米栏,就相当于运动员们听到发令枪响冲离起跑线的那一刻。
结束:表示指定的事件在流程实例结束时触发。
即流程实例中所有的活动实例均已完成时触发。
超时:表示指定的事件在流程实例超时时触发。
例如:若流程的超时时间订为1天,那么定义的事件将在流程实例启动时开始计时,并在1天之后触发此事件。
提醒:表示指定的事件在流程实例指定的提醒时间触发。
例如:若流程的提醒时间订为1小时,那么定义的事件将在流程实例启动时开始计时,并在超时前1小时触发此事件。
事件类型:标明事件动作的类型。
EOS WorkFlow提供基于EOS平台的业务逻辑和运算逻辑两种类型。
事件动作:由开发人员根据具体的业务需求自行定义。
可以是一个运算逻辑也可以是一个业务逻辑。
2.1.2.2 触发事件设置方法
【场景】
在流程“启动的同时,获取指定节点信息并放入该流程实例相关数据的指定节点下。
如获取流程信息中创建者节点(WFContext/WFProcessInst/creator),放入相关数据区Node/creator下。
【分析】
通过【场景】的描述,我们可以采用流程触发事件的方式实现该需求。
分析为:
1、“在流程启动的同时……”,表示触发的时机为启动,调用方式为同步。
这里需要特别注意的是,调用方式同步和异步的区别。
同步是指:以“同步”的方式调用触发事件,等待事件运行完成后,该流程才启动。
同步是指:以“异步”的方式调用触发事件,该流程在启动完触发事件后就启动,而无需等待触发事件运行完成。
2、“获取指定节点信息”为事件动作,可以用业务逻辑来实现。
触发事件中产生的数据还可以在业务逻辑中输出,这样就可以将这些数据直接设置为相关数据了。
3、要将步骤2中获取的信息放入该流程实例相关数据的指定节点下,具体可在事件参数中设置。
输入参数设置为WFContext,在各类触发事件以及回退事件中,WFContext
属于流程实例的相关数据区部分,这块数据区有固定的数据结构,具体请见:3.2.2流程实例数据区。
触发事件的数据来源于相关数据区,WFContext是相关数据区中固有的一块区域信息,这些信息都放在Wfcontext节点下。
其中,WFContext数据区内容是流程实例自身的信息,相关数据区的内容还有流程中产生的过程数据,即业务数据。
输出参数设置为creator,目标路径为Node/userID。
在触发事件所执行的业务逻辑中会产生一个crator的节点,把这个节点放入到相关数据区
Node/userID下。
目标路径:表示将返回结果存入到流程实例相关数据中的什么位置。
如该例中是将调用业务逻辑的返回结果输出到该流程相关数据的
Node/userID节点下。
注意,目标路径仅对事件类型为业务逻辑的事件动作有效。
[图-设置触发事件的参数]
注意:
如果调用的事件类型为业务逻辑,而参数的数据类型为字符串常量或字符串变量,那么路径中填入的格式必须为:nodeName="value"或nodeName=‘value’(因为业务逻辑不支持直接传入常量或变量)
例如:要传入常量tiger到所调用的业务逻辑中,就必须做如下设置
2.1.3超时设置
如果想扩展和替换EOS工作流的超时和预警机制,可以根据工作流配置文件wfconfig.xml中的工作流引擎服务层相关配置
<module name="service">
<group name="timer">
<configValue key="interval">10000</configValue>
<configValue key="timelimit_calculator"></configValue>
</group>
………………..
参数timelimit_calculator流程和活动时间限制的计算方法类名称,该类必须实现接口com.primeton.eos.wf.service.api.TimeLimitCalculator。
配置为空或者不做配置,表示使用确省实现类:com.primeton.eos.wf.service.TimeLimitCalculatorDefault。
2.1.
3.1 时间限制说明
流程的时间限制表示流程启动后必须在多长时间内完成。
在流程时间限制的设置中EOS WorkFlow为开发人员提供了指定具体的限制时间、超时是否进行邮件通知、是否在超时前进行提醒、是否发提醒通知等功能。
流程时间限制的计时:从流程启动时开始计时
流程时间限制的获取:直接指定、从相关数据获取(格式:3.5.20表示时限为3天5小时20分钟)
发送提醒邮件:EOS WorkFlow可根据流程定义中的具体设置给流程启动者发提醒邮件,提醒他该流程还有多长时间将超时
发送超时邮件:EOS WorkFlow可根据流程定义中的具体设置给流程启动者发送超时邮件,告之他该流程已经超时
提醒时间必须小于指定的时间限制
EOS WORKFLOW判断流程或人工活动超时的原理
流程或人工活动的时间限制中设置的限制时间将写入表WFProcessInst或WFWorkItem的limitNum字段中,单位为毫秒,limitNumDesc是其描述字段;
finalTime是时间限制到达后的时间。
EOS WorkFlow将当前时间与startTime
相减的结果与limitNum比较,一旦超出时间限制就将isTimeOut字段置为Y,表示超时;timeOutNum表示超时了多长时间,在流程结束时写入。
如果设置了超时提醒,该字段可能出现负数,是未超时的表现,只有正数才表示超时的时间,timeOutNumDesc是其描述字段。
2.1.
3.2 时间设置说明
【描述】
设置流程时间限制包括指定时间限制的值、提醒时间的值、决定是否发送超时邮件或提醒邮件
【应用场景】
规定流程A必须在1天内完成,超时进行通知;并在超时前10小时发提醒通知【操作步骤】
1、双击流程A的编辑区,弹出属性设置窗口,点击时间限制选项卡
2、勾选启用时间限制
3、指定时间限制为:1天0小时0分钟
4、勾选是否按设置的时间限制进行超时通知。
此处将会根据wfconfig.xml相关配置给流程启动者发送邮件。
5、指定提前0天10小时0分钟提醒
6、勾选是否按设置的提醒时间进行超时预警。
此处将会根据wfconfig.xml相关配置给流程启动者发送邮件。
[图-设置流程时间限制1]
说明:
1、无论是超时通知的邮件还是提醒的邮件,收件人都是流程启动者
2、这些邮件的发件人,可根据具体情况在配置文件设置$Primeton HOME\eosserver\config目录下的wfconfig.xml设置,相关部分如下所示:
<group name="sendmail">
<configValue key="username">zll</configValue>
<configValue key="password">zll</configValue>
<configValue key="mailServer"></configValue>
<configValue key="mailPort">25</configV alue>
<configValue key="fromMail">zll@</configValue>
<configValue key="fromName">zll</configValue>
<configValue key="authLogin">true</configValue>
</group>
特别说明:EOS工作流超时提醒只提醒一次。
流程实例一旦超时,就会触发相应的操作将流程实例中的WFProcessInst/isTimeOut节点设置为Y。
如果想实现重复提醒功能,通常的做法是为流程设置超时的触发事件。
在超时触发事件中注册一个定时器,定时扫描该流程实例是否完成,如果没有完成就执行发放邮件或者短信都通知的操作。
2.1.4流程启动者
流程启动者表示可以启动某个流程的组织、角色或人。
EOS WorkFlow提供两种流程启动策略:任意人员启动和从组织机构树获取。
这样做的目的主要是从实际工作中的安全性考虑,视流程的具体情况限定可以启动该流程的人员范围。
[图-流程启动者]
当流程实例运行的时候,可以在相关数据区的如下节点xpath找到流程启动者:<WFContext>
<WFProcessInst>
< creator >tiger</ creator >
</ WFProcessInst >
</ WFContext >
2.1.5流程定义特别说明
工作流的自动活动或触发事件调用带事务的业务逻辑的注意事项
因为工作流的事务控制和业务逻辑的事务控制是分开的,所以,当工作流的自动活动或触发事件调用了带事务控制的业务逻辑时,工作流引擎默认忽略业务逻辑中的事务,这样就存在一个问题:
业务逻辑中出现了异常,并通过异常线回滚,这时,业务数据提交不成功,但是,工作流引擎并没有接收到异常,它会继续往后走,最终就出现工作流事务和业务事务不一致的现象。
【解决方案和步骤】
建议业务逻辑中不要用异常线回退到回滚,让异常直接抛出,这样工作流引擎会接收到异常,进而做回滚!
【备注】
1)异常线不能随便使用,如果一定要用,最好设置返回值返回,最后转向出错页面;
2)使用异常线前还要注意BL方法是否会抛异常,因为不是所有的BL方法都会抛异常。
2.2 活动定义
EOS WorkFlow提供了六种类型的活动。
开始活动、结束活动、人工活动、自动活动、子流程活动以及路由活动。
活动图元介绍
图元名称含义
开始活动表示一个业务流程的开始。
在流程开始活动可以定义流程的启动表单以及业务流程的触发事件。
人工活动指需要人工干预、进行某种操作的活动。
比如填写表单等。
自动活动指无需人工干预,系统自动执行的活动。
比如获取系统时间、往数据库中插入记录等。
子流程一种特殊的活动,此活动本身是指向某一个流程,表示当流程实例运行至此时,启动另外一个流程。
子流程的启动分为同步和异步两种方式。
路由活动是一种逻辑活动,根据控制条件判断流程的流向。
该活动本身并不执行任何具体的操作。
结束活动表示一个业务流程的结束。
2.2.1设置活动基本信息
活动包括:人工活动、自动活动、子流程。
1)自动活动的基本信息设置如下:
•自动返回结果:
–“是”:表示执行动作的返回结果全部自动放入相关数据的根路径下。
–“否”:表示执行动作的返回结果将不会自动放入相关数据中去。
此时,如要将返回结果中的某项返回到相关数据中,可在参数选项卡中设置。
–该项设置仅对调用类型是业务逻辑有效
•调用方式:
–“同步”:直到调用的执行动作运行完后当前自动活动才结束
–“异步”:当前自动活动在调用执行动作后就结束,而无需等待执行动作运行完
•结束方式:
–“自动”:调用完执行动作后,工作流引擎自动将当前自动活动结束–“人工:”调用完执行动作后,引擎不将当前自动活动结束,而是等待外部调用结束该活动
2)子流程的基本信息设置如下:
•调用方式:
–“同步”:以“同步”的方式调用子流程,等待子流程运行完成后,该子流程活动才结束
–“异步”:以“异步”的方式调用子流程,当前活动在启动完子流程后就结束,而无需等待子流程运行完成
•子流程:单击【选择…】按钮,从弹出窗口的资源树中选择子流程或直接输入子流程,填写规则为:构件包名.工作流构件名.业务流程名。
如果调用的子流程需要输入或输出一些参数请在参数选项卡中设置
2.2.2聚合模式、分支模式
活动的“分支”与“聚合”模式在流程定义时设置,分别描述了活动在运行时何时被触发以及或个运行结束后,它的后继活动如何被触发。
2.2.2.1 聚合模式
聚合模式,表示该活动得以触发的方式。
它包括“全部聚合(AND)”、“单一聚合(XOR)”以及“多路聚合(OR)”三种情况:
1.“全部聚合”型聚合模式
表示该活动必须等到它的所有前驱活动全部完成才可以触发。
2.“单一聚合”型聚合模式
表示当该活动的若干前驱活动中只要有一个满足条件的活动完成,该活动即可被触发。
3.“多路聚合”型聚合模式
表示该活动必须等到它的所有满足条件的前驱活动全部完成才可以触发。
满足条件的前驱活动包括:
1)它与该活动的连线是“默认值“;
2)它与该活动连线上条件为“true”;
3)多路聚合还需要特别说明的是:多路聚合不一定要设置默认连线,也就
是说一个多路聚合的全部连线都可以设置条件。
【示例】
1.“全部聚合”型聚合模式示例
[图-“全部聚合”型聚合模式]
如上图所示,“人工活动3”的“聚合模式(JoinMode)”设置为“全部聚合”,那么只有在它的前驱“人工活动”、“人工活动1”,“人工活动2”都完成后,“人工活动3”才可以运行。
2.“单一聚合”型聚合模式示例
[图-“单一聚合”型聚合模式]
如上所示,由于“人工活动3”的“聚合模式(JoinMode)”设置为“单一聚合”,那么根据上面的算法说明,当“人工活动”完成后,“人工活动3”
就可以运行了。
而无需考虑“人工活动1”或“人工活动2”是否完成。
3.“多路聚合”型聚合模式示例
1)由前驱活动射出的连线上中有默认值
[图-“多路聚合”型聚合模式]
如上图所示,由于“人工活动3”的“聚合模式(JoinMode)”是“多路聚合”并且在处理的过程中“num==6”,那么根据上面的算法说明由于“人工活动”与“人工活动3”以及“人工活动1”与“人工活动3”的连线上的条件都满足,因此“人工活动3”在“人工活动”和“人工活动1”完成后被触发。
2)由前驱活动射出的连线上都设置条件
[图-“多路聚合”型聚合模式]
如上图所示,由于“活动E”的“聚合模式(JoinMode)”是“多路聚合”并且在处理的过程中“num==6”,那么根据上面的算法说明由于“活动B与“活动D”的射出的连线上的条件都满足,因此“活动B与“活动D”都完成后,活动E 才被触发。
2.2.2.2 分支模式
分支模式,表示该活动结束后,它的后继活动的触发情况。
它包括“全部分支(AND)”、“单一分支(XOR)”以及“多路分支(OR)”三种情况:
1.“全部分支”型分支模式
表示该活动结束后它的所有后继活动将同时被触发。
2.“单一分支”型分支模式
如果该活动的分支模式为“单一分支”,那么引擎会根据由该活动“射出”
的连接线上的条件进行判断,决定该触发哪个后继活动。
具体分为下面三种情况:
1)满足条件的连接线所指的活动被触发;
2)如果有若干个连接线上的条件都满足,那么比较连接线上的优先级,
优先级高的那条连接线所指的活动将被触发;
3)如果连接线上的条件都不满足,那么取“默认值”的那条连接线所
指的活动将被触发。
[注]活动的“分支模式”为“单一分支”时,由它射出的连接线有且只有一条线的取值是“默认值”。
3.“多路分支”型分支模式
如果该活动的分支模式为“多路分支”,那么引擎会根据由该活动“射出”
的连接线上的条件进行判断,决定触发哪个或哪些后继活动。
具体分为下面二种情况:
1)如果连接线上取“默认值”,那么由此连接线所指的后继活动会被触发;
2)如果连接线上的条件满足,那么由此连接线所指的后继活动会被触发。
3)多路分支还需要特别说明的是:多路分支不一定要设置默认连线,也就
是说一个多路分支的全部连线都可以设置条件。
【示例】
1.“全部分支”型分支模式示例
[图-“全部分支”型分支模式]
如上图所示,由于A活动的分支模式是“全部分支”,那么当A活动完成后它后继的所有活动(B、C、D)将同时被触发。
2.“单一分支”型分支模式示例
1)由该活动射出的连线上只有一个满足条件时
[图-“单一分支”型分支模式1]
如图所示,由于“A”活动的分支模式是“单一分支”并且在处理的过程中“num==6”,所以由“A”射出的连接线上只有“num > 5”满足
条件,因此“B”活动满足条件被触发。
2)由该活动射出的连线上有若干个满足条件时
[图-“单一分支”型分支模式2]
如上图所示,由于“A”活动的分支模式是“单一分支”并且在处理的过程中“num==1”,尽管由A指向B和C的两条分支都满足条件,
但指向B的优先级大于指向C的优先级,因此“B”活动被触发。
3)由该活动射出的连线上没有一个满足条件时
[图-“单一分支”型分支模式3]
如上图所示,由于“A”活动的分支模式是“单一分支”并且在处理的
过程中“num==2”,那么由“A”射出的连接线上没有满足条件的,因
此“D”活动被缺省触发。
3.“多路分支”型分支模式示例
1)由活动射出的连线上中有默认值
[图-“多路分支”型分支模式]。