产生工作
- 异步任务 -- 工作数据写到一般工作表 act_ru_job 中
- 定时事件 -- 数据写到定时工作表act_ru_timer_job 中
- 暂停的工作 -- 当定时任务被暂停时,会将数据写到暂停工作表act_ru_suspended_job 中
- 无法执行的工作 -- 如果有一个任务被执行多次仍然无法执行,就会写到无法执行工作表 act_ru_deadletter_job 中,
一、测试 异步任务 产生的工作 -- 工作数据写到一般工作表 act_ru_job 中
步骤
1.1 新建一个 service_task.bpmn
1.2 创建一个 Sevice Task 这个节点的 异步处理类
MyJavaDelegate 需 实现 JavaDelegate 接口
package com.xiangshuai.act.c13;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class MyJavaDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution arg0) {
System.out.println("这是异步处理类");
}
}
1.3 改 service_task.bpmn
1.4 改 activiti.cfg.xml
1.5 测试方法
//测试 异步任务 产生的工作 -- 工作数据写到一般工作表 act_ru_job 中
public static void servieTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("service_task.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
}
二、测试 定时事件 产生的工作-- 数据写到定时工作表act_ru_timer_job 中
2.1 新建一个 timer_test.bpmn
2.2改 activiti.cfg.xml
这里也必须设置异步执行,否则即使改了timer_test.bpmn
设置了1分钟后会删掉act_ru_timer_job中的数据,也不会执行
2.3 改 timer_test.bpmn
下图1分钟后会执行act_ru_timer_job中定时任务 执行完会删掉act_ru_timer_job中的数据
2.4 测试方法
//二、测试 定时事件 产生的工作-- 数据写到定时工作表act_ru_timer_job 中
public static void timerTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("timer_test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
}
三、测试 当定时任务被暂停时,会将数据从act_ru_timer_job写到暂停工作表act_ru_suspended_job 中,当任务**又会 从act_ru_suspended_job写回act_ru_timer_job表
3.1 新建一个 suspend_test.bpmn(也可以直接COPY timer_test.bpmn
)
3.2 和测试定时事件一样在suspend_test.bpmn加 <timeDuration>PT5M</timeDuration> 这个标签,用5M即5分钟,不会过短的时间就跳到 User Task 节点,方便我们观察act_ru_timer_job 工作数据和act_ru_suspended_job工作数据的 切换
3.3 测试方法
/*
测试 当定时任务被暂停时,会将数据从act_ru_timer_job写到暂停工作表act_ru_suspended_job 中,
当任务**又会 从act_ru_suspended_job写回act_ru_timer_job表
*/
public static void suspendTestTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("suspend_test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
try {
Thread.sleep(10000);//睡10秒看 act_ru_suspended_job和act_ru_timer_job表数据
runService.suspendProcessInstanceById(pi.getId());//定时任务被暂停,工作数据从act_ru_timer_job表写到act_ru_suspended_job
Thread.sleep(10000);//睡10秒看 act_ru_suspended_job和act_ru_timer_job表数据变化
runService.activateProcessInstanceById(pi.getId());//定时任务被**,工作数据从表写到act_ru_suspended_job写到act_ru_timer_job
//看 act_ru_suspended_job和act_ru_timer_job表数据变化
//最后因为设置了<timeDuration>PT5M</timeDuration> 5分钟后会执行这个定时任务,从act_ru_timer_job表删除数据,调到下一个节点
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
四、测试 无法执行的工作-- 如果有一个任务被执行多次仍然无法执行,就会写到无法执行工作表 act_ru_deadletter_job 中
4.1 创建error_task.bpmn
4.2创建一个 Sevice Task 这个节点的 异步处理类
ExceptionDelegate需 实现 JavaDelegate 接口
package com.xiangshuai.act.c13;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class ExceptionDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution arg0) {
System.out.println("这是处理类");
throw new RuntimeException("always exception");
}
}
4.3 改error_task.bpmn
4.4 改 activiti.cfg.xml
4.5 测试方法
public static void errorServieTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
ManagementService managementService = engine.getManagementService();
Deployment dep = rs.createDeployment().addClasspathResource("error_task.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
Job job = managementService.createJobQuery().singleResult();
managementService.setJobRetries(job.getId(), 2); //设置如果有一个任务 执行多次(2次,执行MyJavaDelegate两次execute方法,报两次异常,默认是三次)仍然无法执行,就会写到无法执行工作表 act_ru_deadletter_job 中
/* managementService.executeJob(job.getId()); --在 activiti.cfg.xml 如果不设置<property name="asyncExecutorActivate" value="true"></property>
才需手动执行工作*/
JobGenTest.java
package com.xiangshuai.act.c13;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
/**
* * @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤9-Activiti工作的产生与管理
* 或 我的网盘\我的笔记学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤9-Activiti工作的产生与管理
*
*/
public class JobGenTest {
public static void main(String[] args) {
//servieTaskTest();//输出结果 System.out.println(pi.getId()),MyJavaDelegate中的System.out.println("这是异步处理类");
//timerTaskTest();//设置好 timer_test.bpmn, activiti.cfg.xml后会执行定时任务
//suspendTestTest();
errorServieTaskTest();//执行完act_ru_deadletter_job 就有数据了
}
//测试 异步任务 产生的工作 -- 工作数据写到一般工作表 act_ru_job 中
public static void servieTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("service_task.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
}
//二、测试 定时事件 产生的工作-- 数据写到定时工作表act_ru_timer_job 中
public static void timerTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("timer_test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
}
/*
测试 当定时任务被暂停时,会将数据从act_ru_timer_job写到暂停工作表act_ru_suspended_job 中,
当任务**又会 从act_ru_suspended_job写回act_ru_timer_job表
*/
public static void suspendTestTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("suspend_test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
try {
Thread.sleep(10000);//睡10秒看 act_ru_suspended_job和act_ru_timer_job表数据
runService.suspendProcessInstanceById(pi.getId());//定时任务被暂停,工作数据从act_ru_timer_job表写到act_ru_suspended_job
Thread.sleep(10000);//睡10秒看 act_ru_suspended_job和act_ru_timer_job表数据变化
runService.activateProcessInstanceById(pi.getId());//定时任务被**,工作数据从表写到act_ru_suspended_job写到act_ru_timer_job
//看 act_ru_suspended_job和act_ru_timer_job表数据变化
//最后因为设置了<timeDuration>PT5M</timeDuration> 5分钟后会执行这个定时任务,从act_ru_timer_job表删除数据,调到下一个节点
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void errorServieTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
ManagementService managementService = engine.getManagementService();
Deployment dep = rs.createDeployment().addClasspathResource("error_task.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
Job job = managementService.createJobQuery().singleResult();
managementService.setJobRetries(job.getId(), 2); //设置如果有一个任务 执行多次(2次,执行MyJavaDelegate两次execute方法,报两次异常,默认是三次)仍然无法执行,就会写到无法执行工作表 act_ru_deadletter_job 中
/* managementService.executeJob(job.getId()); --在 activiti.cfg.xml 如果不设置<property name="asyncExecutorActivate" value="true"></property>
才需手动执行工作*/
}
}