工作流引擎:工作流的核心组件,对流程实例、任务实例以及其状态进行管理
流程定义:预先定义的业务流转逻辑
流程实例:业务的一次实际流转过程
参与者:任务的执行者
活动(任务):组成流程定义的节点
活动实例:组成流程实例的元素
流转:从一个节点到另一个节点这一行为
工作列表:当前需要办理的任务集合
开发步骤
1)根据实际应用场景创建流程文件;
即编写*.jpdl.xml文件
2)部署流程文件或流程资源到系统中;
3)执行流程(使用指定的流程定义);
3.1)启动流程实例
3.2)获取任务
3.3)开始任务
3.4)结束任务
3.1到3.4是办理一个任务的过程,流程的执行就是启动流程实例+一次次办理任务的过程。
流程在实际应用场景中的一些操作
一.流程的定义管理
流程定义的发布、查询、删除、暂停、恢复
二.流程实例管理
流程实例的启动、显示流程图、执行、暂停、恢复
三.任务管理
分配任务、收回任务、定时任务、任务与表单绑定
四.流程的历史查询
任务的历史、流程实例历史、活动历史
---下面开始进行代码描述------
在详细描述之前,我们先来了解一下流程引擎ProcessEngine
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
我们需要的一些服务都是通过流程引擎得到的 RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();
一.流程的定义管理
1.1流程定义的发布(即部署流程文件或流程资源到系统中)
流程定义*.jpdl.xml的内容可以从文件, 网址,字符串,输入流或zip输入流中获得
public interface NewDeployment extends Deployment {
...
/** adds a resource as a string */
NewDeployment addResourceFromString(String resourceName, String string);
/** adds a resource as a string */
NewDeployment addResourceFromInputStream(String resourceName, InputStream inputStream);
/** adds a resource as a resource from the classpath */
NewDeployment addResourceFromClasspath(String resourceName);
/** adds a resource as a url */
NewDeployment addResourceFromUrl(URL url);
/** adds a resource as a zip stream */
NewDeployment addResourcesFromZipInputStream(ZipInputStream zipInputStream);
/** adds a resource from a file */
NewDeployment addResourceFromFile(File file);
...
}
在测试的时候
RepositoryService repositoryService = processEngine.getRepositoryService();
//布署当前目录下test.jpdl.xml文件
String deploymentId = repositoryService.createDeployment().addResourceFromClasspath("test.jpdl.xml").deploy();
二、流程实例管理
2.1流程实例启动
启动方法参看org.jbpm.api.ExecutionService。
启动一个新的流程实例的最简单最常用的方法:
有的时候,我们在刚启动实例的时候就需要加一个变量进去。
我们假设在填写请假单之前需要传入一个applyName参数进去
<process name="leave" xmlns=" http://jbpm.org/4.3/jpdl">
<start g="67,6,48,48" name="开始">
<transition g="-30,-10" name="请假" to="填写请假单"/>
</start>
<task assignee="#{applyName}" g="45,102,92,52" name="填写请假单">
<transition g="591,124:-127,-18" name="提交申请" to="主管审核"/>
</task>
我们可以这样来实现
variables.put("applyName", "dyaln");
ExecutionService executionService = processEngine.getExecutionService();
ProcessInstance processInstance = executionService.startProcessInstanceByKey("leave",variables);