第5章 Activiti 入门体验

5.1 流程定义

5.1.1 Activiti-Designer 使用

5.1.1.1 Palette(画板)

在 eclipse 或 idea 中安装 activiti-designer 插件即可使用,画板中包括以下结点:

Connection—连接

Event—事件

Task—任务

Gateway—网关

Container—容器

Boundary event—边界事件

Intermediate event- -中间事件

流程图设计完毕保存生成.bpmn 文件。

5.1.1.2 新建流程(IDEA 工具)

首先选中存放图形的目录(本次我们选择 resources 下的 bpmn 目录),点击菜单:New-BpmnFile,如下图所示:

Activiti7工作流引擎-Activiti入门体验_eclipse

弹出如下图所示框:

Activiti7工作流引擎-Activiti入门体验_activiti_02

起完名字 holiday 后(默认扩展名为 bpmn),就可以看到进入了流程设计页面,如图所示:

Activiti7工作流引擎-Activiti入门体验_eclipse_03

5.1.1.3 新建流程(Eclipse 工具)

首先选中存放图形的目录(本次我们选择 resources 下的 bpmn 目录), File-New-Other 菜单,打开如下窗口。

Activiti7工作流引擎-Activiti入门体验_业务流程_04

创建成功:

Activiti7工作流引擎-Activiti入门体验_eclipse_05

左侧区域是绘图区,右侧区域是 palette 画板区域

鼠标先点击画板的元素即可在左侧绘图。

5.1.2 绘制流程

Activiti7工作流引擎-Activiti入门体验_Activiti入门体验_06

图形绘制好后会生成两个文件:

Activiti7工作流引擎-Activiti入门体验_activiti_07

自动生成图形,需要设置 eclipse:

Activiti7工作流引擎-Activiti入门体验_Activiti入门体验_08

5.1.3 指定流程定义 key

流程定义 key 即流程定义的标识,在 eclipse 中通过 properties 视图查看流程的 key

建议:相同的业务流程,流程定义的 key 名字定义一样,比如,如果需要创建新的业务流程,请假流程则使用新的 key。

Activiti7工作流引擎-Activiti入门体验_业务流程_09

5.1.4 指定任务负责人

在 properties 视图指定每个任务结点的负责人,比如下边是填写请假单的负责人为 zhangsan

Activiti7工作流引擎-Activiti入门体验_eclipse_10

5.2 部署流程定义

部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流程引擎 activiti 中,方法如下:

使用 ProcessEngine 创建 RepositoryService,代码如下:

// 获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//部署对象
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/myholiday.bpmn")// bpmn文 件
.addClasspathResource("diagram/myholiday.png")// 图片文件
.name("请假申请流程")
.deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());

执行此操作后 activiti 会将上边代码中指定的 bpm 文件和图片文件保存在 activiti 数据库。

5.3 启动一个流程实例

流程定义部署在 activiti 后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。

针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于 java 类与 java 对象的关系,类定义好后需要 new 创建一个对象使用,当然可以 new 多个对象。对于请假申请流程,张三发起一个请假申请单需要启动一个流程实例,请假申请单发起一个请假单也需要启动一个流程实例。

代码如下:

// 启动一个流程实例
@Test
public void startProcessInstance() {
// 获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根据流程定义key启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myholiday01");
System.out.println(" 流程定义 id : " +
processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println(" 当前活动 Id : " + processInstance.getActivityId());
}

5.4 任务查询

流程启动后,各各任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。

// 查询当前个人待执行的任务
@Test
public void findPersonalTaskList() {
// 任务负责人
String assignee = "zhangsan";// 创建TaskService
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()//
.processDefinitionKey("myholiday01")//
.taskAssignee(assignee)//只查询该任务负责人的任务
.list();
for (Task task : list) {
System.out.println(" 流 程 实 例 id : " +
task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}

5.5 任务处理

任务负责人查询待办任务,选择任务进行处理,完成任务。

// 完成任务
@Test
public void completTask() {
//任务id
String taskId = "8305";
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
//完成任务
taskService.complete(taskId);
System.out.println("完成任务id="+taskId);
}