一、命令拦截器
1.命令模式与责任链模式
2.命令拦截器的配置
配置Interceptor
- customPreCommandInterceptors:配置在默认拦截器之前
- customPostCommandInterceptors:配置在默认拦截器之后
- commandInvoker:配置最后的执行器
3.Activiti的拦截器
拦截器的代码实现
package com.syc.activiti.interceptor;
import org.activiti.engine.impl.interceptor.AbstractCommandInterceptor;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 执行时间
*/
public class DurationCommandInterceptor extends AbstractCommandInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(DurationCommandInterceptor.class);
@Override
public <T> T execute(CommandConfig config, Command<T> command) {
long start = System.currentTimeMillis();
try {
return this.getNext().execute(config,command);
} finally {
long duration = System.currentTimeMillis() - start;
LOGGER.info("{} 执行时长 {} 毫秒",command.getClass().getSimpleName(), duration);
}
}
}
测试
package com.syc.activiti.myconfig;
import org.activiti.engine.event.EventLogEntry;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.engine.test.Deployment;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class ConfigInterceptorTest {
private static final Logger LOGGER = LoggerFactory
.getLogger(ConfigInterceptorTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti_interceptor.cfg.xml");
@Test
@Deployment(resources = {"com/imooc/activiti/my-process.bpmn20.xml"})
public void test() {
ProcessInstance processInstance = activitiRule.getRuntimeService()
.startProcessInstanceByKey("my-process");
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
activitiRule.getTaskService().complete(task.getId());
}
}
二、作业执行器 Job Executor
涉及到的内容:
-
作业执行器的配置
-
配置自定义线程池
-
流程定义定时启动流程
相关配置:
-
asyncExecutorActivate:激活作业执行器
-
asyncExecutorXXX:异步执行器的属性配置
-
asyncExecutor:异步执行器bean
自定义线程池的相关参数:
-
corePoolSize:核心线程数
-
maxPoolSize:最大线程数
-
queueCapacity:堵塞队列大小
自定义线程池的参数配置:
备注:R5循环5次,间隔时间为25小时(一天加一小时)
package com.syc.activiti.myconfig;
import org.activiti.engine.event.EventLogEntry;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.engine.test.Deployment;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class ConfigJobTest {
private static final Logger LOGGER = LoggerFactory
.getLogger(ConfigJobTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti_job.cfg.xml");
@Test
@Deployment(resources = {"com/imooc/activiti/my-process_job.bpmn20.xml"})
public void test() throws InterruptedException {
LOGGER.info("start");
List<Job> jobList = activitiRule
.getManagementService().createTimerJobQuery().listPage(0, 100);
for (Job job : jobList) {
LOGGER.info("定时任务 {}, 默认重试次数 {}", job, job.getRetries());
}
LOGGER.info("jobList.size = {}", jobList.size());
Thread.sleep(1000*100);
LOGGER.info("end");
}
}
my-process_job.bpmn20.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: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/test">
<process id="my-process">
<!--<startEvent id="start" />-->
<startEvent id="start">
<timerEventDefinition>
<timeCycle>R5/PT10S</timeCycle><!--执行5次,间隔10秒去执行-->
</timerEventDefinition>
</startEvent>
<sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" />
<userTask id="someTask" name="Activiti is awesome!" />
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />
<endEvent id="end" />
</process>
</definitions>