工作流 Activiti使用记录
一、如何画图
1、可以用eclipse 插件
下载插件,Activiti BPMN 2.0 designer
2、可以用idea插件(不太好用)
actiBPM
3、可以用acitviti提供的编辑器
activiti官网会提供 activiti-explorer.war ,可以供编辑 流程图。
二、流程图关键组件
1、开始活动节点
2、用户任务
可以指定执行人,由执行任务时传入 userId指定
3、网关
示例:排他网关,根据不同的条件流向不同的下一个任务,条件由执行任务时传入变量 指定,如下就是传入checkSuggest
4、结束节点
三、工作流核心API
1、ProcessEngine
- 在Activiti中最核心的类,其他的类都是由他而来。
- ProcessEngines的getDefaultProceeEngine方法时会自动加载classpath下名为activiti.cfg.xml文件。
- 可以产生RepositoryService
- 可以产生RuntimeService
- 可以产生TaskService
各个Service的作用:
RepositoryService | 管理流程定义 |
RuntimeService | 执行管理,包括启动、推进、删除流程实例等操作 |
TaskService | 任务管理 |
HistoryService | 历史管理(执行完的数据的管理) |
IdentityService | 组织机构管理 |
FormService | 一个可选服务,任务表单管理 |
ManagerService |
2、RepositoryService
是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片
3、RuntimeService
是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。
4:TaskService
是activiti的任务服务类。可以从这个类中获取任务的信息。
5、HistoryService
是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。
6、ProcessDefinition
流程定义类。可以从这里获得资源文件等。
7、ProcessInstance
代表流程定义的执行实例。
8、Execution
Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。
四、使用工作流api
1、启动流程实例
HashMap<String, Object> map = new HashMap<String, Object>(1);
map.put("baoXiaoId", baoXiaoId);
ProcessInstance pi = processEngine.getRuntimeService()//管理执行对象和流程实例相关的Service(正在执行)
.startProcessInstanceByKey("baoxiao2",map);//使用流程定义的key启动流程实例,因为当使用流程定义key的时候,默认启动的是最新版本
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskCreateTime().asc().singleResult();
taskService.complete(task.getId());
2、完成我的个人任务
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().variableValueEquals("baoXiaoId", baoxiaoid).singleResult();
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskName(loginUser.getStatement()).singleResult();
HashMap<String, Object> map = new HashMap(1);
map.put("message", "同意");
taskService.setVariableLocal(task.getId(), "remark", remark==null?"同意":"同意:"+remark);
taskService.complete(task.getId(), map);
3、查看我的待处理个人任务
try {
taskQuery = taskService.createTaskQuery().taskName(loginUser.getStatement());
} catch (Exception e) {
return null;
}
List<Task> list = taskQuery.list();
if(list.size()>0){
List<String> baoxiaoids=new ArrayList<String>();
for (Task task : list) {
String baoXiaoId = runtimeService.getVariable(task.getExecutionId(), "baoXiaoId", String.class);
baoxiaoids.add(baoXiaoId);
}
List<BaoXiao> byBaoXiaoIds = baoXiaoService.findByBaoXiaoIds(baoxiaoids);
return byBaoXiaoIds;
}
结尾:
附上我画的流程图和activiti使用参考文档(很全很方便)