先设计流程图,受理人位置直接空着
设置任务监听器并指定好自定义的类的路径,不知道怎么画的可以直接全部复制粘贴到xml文件中
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="reject" name="reject" isExecutable="true">
<startEvent id="start"/>
<userTask id="userTask1" name="请假审批">
<extensionElements>
<activiti:taskListener event="create" class="n_reject.MyTaskListener"></activiti:taskListener>
</extensionElements>
</userTask>
<userTask id="userTask2" name="经理审批">
<extensionElements>
<activiti:taskListener event="create" class="n_reject.MyTaskListener1"></activiti:taskListener>
</extensionElements>
</userTask>
<endEvent id="end"/>
<sequenceFlow id="sid-170af7ad-c5ac-4c35-9b2f-788430070d1b" sourceRef="userTask1" targetRef="userTask2"/>
<sequenceFlow id="flow1" sourceRef="userTask2" targetRef="end" name="同意">
<conditionExpression>${message=='同意'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-9559e39b-52b9-4fd1-a9cf-dd5bfaa88e88" sourceRef="start" targetRef="userTask1"/>
<sequenceFlow id="flow2" sourceRef="userTask2" targetRef="userTask1" name="不同意">
<conditionExpression>${message=='不同意'}</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_reject">
<bpmndi:BPMNPlane bpmnElement="reject" id="BPMNPlane_reject">
<bpmndi:BPMNShape id="shape-b3440631-0378-4c7c-924f-be411e3ff6b5" bpmnElement="start">
<omgdc:Bounds x="-45.0" y="-120.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-c10ad80f-9d77-4aef-bbc3-0948423aa888" bpmnElement="userTask1">
<omgdc:Bounds x="-60.0" y="-65.0" width="60.000004" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-e36b84ea-bceb-4215-a6b4-91545d1b0122" bpmnElement="userTask2">
<omgdc:Bounds x="-62.5" y="0.0" width="65.0" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-80971338-75dd-4980-8281-898593d03cb9" bpmnElement="end">
<omgdc:Bounds x="-45.0" y="80.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-043009b0-c3fc-4c93-b5ef-44460f076353" bpmnElement="sid-170af7ad-c5ac-4c35-9b2f-788430070d1b">
<omgdi:waypoint x="-29.999998" y="-25.0"/>
<omgdi:waypoint x="-30.0" y="0.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-77722180-1fbd-42c0-b93d-bc1630bfdbd6" bpmnElement="flow1">
<omgdi:waypoint x="-30.0" y="40.0"/>
<omgdi:waypoint x="-30.0" y="80.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-59037ea7-c8ea-4911-8db6-c933e24d2de1" bpmnElement="sid-9559e39b-52b9-4fd1-a9cf-dd5bfaa88e88">
<omgdi:waypoint x="-30.0" y="-90.0"/>
<omgdi:waypoint x="-29.999998" y="-65.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-ee6aac1c-c0a9-46a6-b7a2-4b2ffb5a3bd8" bpmnElement="flow2">
<omgdi:waypoint x="2.5" y="20.0"/>
<omgdi:waypoint x="2.5" y="20.0"/>
<omgdi:waypoint x="2.5000005" y="20.0"/>
<omgdi:waypoint x="63.75" y="20.0"/>
<omgdi:waypoint x="63.75" y="-45.0"/>
<omgdi:waypoint x="4.7683716E-6" y="-45.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
这些里面是重点
然后创建流程引擎,部署流程,启动流程,启动流程的时候会自动跳转到自定义的类中跑自定义的代码,如果没跳的话就是没有设置好路经
package n_reject;
import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.task.Task;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 使用任务监听器动态设置任务受理人
*/
public class TestReject {
// 得到流程引擎
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 重置数据库
@Test
public void testResetDatabase() {
ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault()
.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE)
.buildProcessEngine();
}
// 部署流程使用classpath
@Test
public void deployProcess() {
RepositoryService repositoryService = this.processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("bpmn/reject.bpmn20.xml")
.name("请假流程")
.deploy();
System.out.println("部署完成,流程部署id:" + deploy.getId());
}
// 启动流程并指定下一个任务的办理人
@Test
public void startProcess() {
RuntimeService runtimeService = this.processEngine.getRuntimeService();
String processDefinitionKey = "reject";
runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("启动成功");
}
// 查询我的个人任务
@Test
public void queryMyTask() {
TaskService taskService = this.processEngine.getTaskService();
String assignee = "张三";
List<Task> list = taskService.createTaskQuery()
// 条件
.taskAssignee(assignee) // 根据任务办理人查询任务
// 排序
.orderByTaskCreateTime().desc()
// 结果集
.list();
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out.println("任务id:" + task.getId());
System.out.println("任务办理人:" + task.getAssignee());
System.out.println("执行实例id:" + task.getExecutionId());
System.out.println("任务名称:" + task.getName());
System.out.println("流程定义id:" + task.getProcessDefinitionId());
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("******************************");
}
}
}
// 办理任务
@Test
public void completeTask() {
TaskService taskService = this.processEngine.getTaskService();
// 根据任务id去完成任务
String taskId = "15003";
Map<String,Object> variables = new HashMap<>();
variables.put("message","不同意");
taskService.complete(taskId,variables);
System.out.println("任务完成");
}
}
这个类弄好之后先不要着急执行,自定义的类也要弄好
package n_reject;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("开始指派受理人");
delegateTask.setAssignee("张三");
}
}
一共有两个任务监听器,所以我也设置了两个类,比较好理解
package n_reject;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MyTaskListener1 implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("开始指派受理人");
delegateTask.setAssignee("李四");
}
}
全部弄好之后可以启动,可以看控制台打桩输出或者观察数据库数据来判断是否成功
第一次上传,多多关照