1. 组任务
在之前的例子里面是用到了assignee
下面介绍另外的两个
- Candidate-users 候选人
- Candidate-groups 候选组
1.1 Candidate-users 候选人
流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。
//注意,一个节点的候选人必须同时指定,不能是指定一两个。
public static void main(String[] args) {
String key="myProcess_1";
String resource = "activiti.cfg.xml";
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
HashMap<String, Object> var = new HashMap<>();
/*
指定全部
*/
var.put("user1","zhangsan");
var.put("user2","lisi");
var.put("user3","wangwu");
runtimeService.startProcessInstanceByKey(key,var);
}
这里是通过表达式的方式来指定的,也可以直接写死在里面。
1.2 组任务办理流程
- 查询任务,通过候选人。
- 声明自己为次任务的 办理人
- 查询自己需要办理的任务
- 完成任务
1.3 组任务归还流程
- 如果讲自己变为任务的办理人,又不想办理任务,就可以归还任务。自己又再次变为任务的候选人。
1.4 其余流程
- 可以将此任务分配给他人。让他成为任务的办理人
2 示例
eg:
public static void main(String[] args) {
String key="myProcess_1";
String resource = "activiti.cfg.xml";
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
HashMap<String, Object> var = new HashMap<>();
//指定候选人。
var.put("user1","zhangsan");
var.put("user2","lisi");
var.put("user3","wangwu");
runtimeService.startProcessInstanceByKey(key,var);
}
- 通过候选人查询任务,zhangsan lisi wangwu 都可以查
public static void main(String[] args) {
String key="myProcess_1";
String resource = "activiti.cfg.xml";
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()//
.processDefinitionKey(key)//
.taskCandidateUser("lisi")//根据候选人查询
.list();
for (Task task : list) {
logger.info("流程实例id: {}",task.getProcessInstanceId());
logger.info("任务id:{}",task.getId());
logger.info("任务负责人:{}",task.getAssignee());
logger.info("任务名称:{}",task.getName());
}
}
- 候选人员拾取组任务后该任务. 注意 拾取任务 即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
即使该用户不是候选人也能拾取,建议拾取时校验是否有资格 组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务
//任务id 办理人
taskService.claim(task.getId(), "lisi");//将自己变为任务的办理人
- 用户查询个人待办任务,并且完成
public static void main13(String[] args) {
String key="myProcess_1";
String resource = "activiti.cfg.xml";
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee("lisi").singleResult();
logger.info("流程实例id: {}",task.getProcessInstanceId());
logger.info("任务id:{}",task.getId());
logger.info("任务负责人:{}",task.getAssignee());
logger.info("任务名称:{}",task.getName());
taskService.complete(task.getId()); //完成任务
}
- 归还组任务
如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人;
注意:
说明:建议归还任务前校验该用户是否是该任务的负责人
也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议 不要这样使用);
public static void main13(String[] args) {
String key="myProcess_1";
String resource = "activiti.cfg.xml";
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee("lisi").singleResult();
logger.info("流程实例id: {}",task.getProcessInstanceId());
logger.info("任务id:{}",task.getId());
logger.info("任务负责人:{}",task.getAssignee());
logger.info("任务名称:{}",task.getName());
taskService.setAssignee(task.getId(),null);//归还给组任务,也将担保人设置为null
}
- 任务交接
任务交接,任务负责人将任务交给其它候选人办理该任务。
String key="myProcess_1";
String resource = "activiti.cfg.xml";
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee("lisi").singleResult();
logger.info("流程实例id: {}",task.getProcessInstanceId());
logger.info("任务id:{}",task.getId());
logger.info("任务负责人:{}",task.getAssignee());
logger.info("任务名称:{}",task.getName());
taskService.setAssignee(task.getId(),"wangwu");//归还给组任务,也将担保人设置为null
网关 (这种看看概念型的东西看看官网就好了)
1. 排他网关
排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策。 当流程 执行到这个网关,所有分支都会判断条件是否为 true,如果为 true 则执行该分支, 注意,排他网关只会选择一个为 true 的分支执行。(即使有两个分支条件都为 true,排他网关也会只 选择一条分支去执行)
所有的条件都不满足就抛出异常。
设置分支条件时,如果所有分支条件都不是 true,报错:
org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway ‘exclusivegateway1’ could be selected for continuing the process
at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivit yBehavior.java:85)
2. 并行网关
并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:
- fork分支:
并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。 - join汇聚:
所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通 过汇聚网关。
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时, 网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
3. 包含网关
包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上 定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行 网关一样。
包含网关的功能是基于进入和外出顺序流的:
- 分支:
所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。 - 汇聚:
所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程 token 的进入顺序流的分支都 到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在 汇聚之后,流程会穿过包含网关继续执行。