介绍: 流程在执行过程中会产生不同的任务。
配置ServiceTask
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
<startEvent id="_2" name="StartEvent"/>
<endEvent id="_3" name="EndEvent"/>
<userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
<!--开启异步,并指定委托类(在下面编码中)。注意:activiti开头的元素不属于bpmn规范,因此该bpmn文件不能移植到其他流程引擎中-->
<serviceTask activiti:exclusive="true" id="ServiceTask" name="ServiceTask"
activiti:async="true" activiti:class="com.xjf.test.MyJavaDelegate"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="ServiceTask"/>
<sequenceFlow id="_7" sourceRef="ServiceTask" targetRef="UserTask"/>
<sequenceFlow id="_8" sourceRef="UserTask" targetRef="_3"/>
</process>
/**
* 实现委托类,需要被ServiceTask元素引用
*
* @Author: xjf
* @Date: 2019/12/2 23:20
*/
public class MyJavaDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution delegateExecution) {
System.out.println("这是处理类");
}
}
<!--开启异步执行器,异步才会自动异步执行,比如异步工作、定时器工作等-->
<property name="asyncExecutorActivate" value="true" />
public static void main(String[] args) throws InterruptedException {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("service-task.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
// 可以查看act_ru_job,会有异步工作。不过此时没有开启异步执行器,流程是卡在ServiceTask任务的,没有往下执行。
// 开启后将看不到数据,因为直接执行了(是异步的)
System.out.println("流程实例id: " + processInstance.getId());
processEngine.close();
System.exit(0);
}
xml配置如下:
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
<startEvent id="_2" name="StartEvent"/>
<intermediateCatchEvent id="IntermediateCatchingEvent" name="IntermediateCatchingEvent">
<timerEventDefinition>
<!--定时任务,定时为一分钟-->
<timeDuration>PT1M</timeDuration>
</timerEventDefinition>
</intermediateCatchEvent>
<userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
<endEvent id="_5" name="EndEvent"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="IntermediateCatchingEvent"/>
<sequenceFlow id="_7" sourceRef="IntermediateCatchingEvent" targetRef="UserTask"/>
<sequenceFlow id="_8" sourceRef="UserTask" targetRef="_5"/>
</process>
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("timer-task.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("流程实例id:" + processInstance.getId());
//程序不能马上关闭,需要等待定时任务执行,然后程序死了,定时任务没法执行
Thread.sleep(120000);
processEngine.close();
System.exit(0);
<timerEventDefinition>
<!--定时5分钟-->
<timeDuration>PT5M</timeDuration>
</timerEventDefinition>
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("suspend-task.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("流程实例ID:" + processInstance.getId());
//因为定时任务时间为5分钟,此时等待10s时工作存放在act_ru_timer_job中
Thread.sleep(10000);
//将任务暂停,则任务会存放到表act_ru_suspended_job中
runtimeService.suspendProcessInstanceById(processInstance.getId());
//再次等待10s后,将任务激活,则任务回到act_ru_timer_job中
Thread.sleep(10000);
runtimeService.activateProcessInstanceById(processInstance.getId());
processEngine.close();
System.exit(0);
public class ExceptionDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println("这是执行器");
//测试不可执行的任务,手动出错
throw new RuntimeException("always exception 手动抛出");
}
}
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
ManagementService managementService = processEngine.getManagementService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("error-task.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("流程实例ID:" + processInstance.getId());
//任务重试次数默认为三次,手动设置为一次,方便快速测试查看
Job job = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
managementService.setJobRetries(job.getId(),1);
Thread.sleep(30000);
processEngine.close();
System.exit(0);