本文节选自《疯狂Workflow讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
开始事件
开始事件表示流程的开启,可以使用各种类型的开始事件来启动流程,例如使用定时器开始事件,定时启动业务流程,可以使用错误开始事件来表示错误业务流程的开始,根据前面章节所述,所有的开始事件都是Catching事件,即全部的开始事件都会等待着被触发。
无指定开始事件
不为开始事件指定任何的触发条件(触发器)的事件为无指定开始事件,使用无指定开始事件,流程引擎并不知道流程将会在什么时候开始,如果需要启动流程,就必须使用RuntimeService的startProcessByXXX方法。需要注意的是,子流程(Sub-Process)中总会是一个无指定开始事件,即使将子流程中的开始事件强制定义为其他开始事件,也会被看作无指定开始事件,因为流程到达子流程(Sub-Process)时,就意味着子流程需要启动,而并不需要其他的启动条件。图11-1为无指定开始事件的图形,代码清单11-5为一个含有无指定开始事件的流程XML配置。
图11-1无指定开始事件图形
代码清单11-5:codes\11\11.3\start-event\resource\bpmn\NoneStartEvent.bpmn
<process id="myProcess" name="myProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="Task"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow1" name="" sourceRef="startevent1"
targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" name="" sourceRef="usertask1"
targetRef="endevent1"></sequenceFlow>
</process>
代码清单11-5的粗体字代码,使用startEvent元素定义了一个开始事件,该元素下没有任何的子元素,表示这个开始事件没有任何的事件定义,是一个无指定开始事件。定义了流程后,要启动该流程,需要使用RuntimeService的startProcessByXXX方法,以下为该流程的启动代码:
//创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//得到流程存储服务组件
RepositoryService repositoryService = engine.getRepositoryService();
//得到运行时服务组件
RuntimeService runtimeService = engine.getRuntimeService();
//部署流程文件
repositoryService.createDeployment()
.addClasspathResource("bpmn/NoneStartEvent.bpmn").deploy();
runtimeService.startProcessInstanceByKey("myProcess");
定时器开始事件
在开始事件中加入定时器事件定义,该开始事件成为一个定时器开始事件,当符合时间条件后,流程启动,而并不需要像无指定开始事件一样,需要使用API启动流程。在日常生活中有许多需要定时启动的流程,例如要求项目经理每天下班时检查成员的工作日志,又如需要定时检查服务器端口是否存在等,此时可以使用定时器开始事件来实现流程的定时启动。图11-2定义了一个简单的工作流程,代码清单11-6为该流程的配置。
图11-2定时器开始流程
代码清单11-6:codes\11\11.3\start-event\resource\bpmn\TimerStartEvent.bpmn