配置 activiti_job.cfg.xml 线程池
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<!--配置自定义的commandInvoker-->
<property name="commandInvoker" ref="commandInvoker"/>
<!--是否开启我们的事件日志-->
<property name="enableDatabaseEventLogging" value="true"/>
<!-- 打开异步线程执行器 (不定义线程池会默认线程池)-->
<property name="asyncExecutorActivate" value="true"/>
<!--自定义线程池-->
<property name="asyncExecutor" ref="asyncExecutor" />
<!--配置监听器监听定时任务-->
<property name="eventListeners">
<list>
<bean class="event.JobEventListener"></bean>
</list>
</property>
</bean>
<bean id="asyncExecutor" class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
<!--需要执行的服务-->
<property name="executorService" ref="executorService"/>
</bean>
<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
<!--配置线程属性-->
<!-- 1.配置线程前缀-->
<property name="threadNamePrefix" value="activiti-job-"/>
<!--2.配置核心线程数-->
<property name="corePoolSize" value="5"/>
<!--配置最大线程数-->
<property name="maxPoolSize" value="20"/>
<!--队列长度-->
<property name="queueCapacity" value="100"/>
<!--当线程都满了拒绝策瑞-->
<property name="rejectedExecutionHandler">
<!-- 默认的策略-->
<bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy">
</bean>
</property>
</bean>
<bean id="commandInvoker" class="interceptor.MDCCommandInvoker"/>
</beans>
定时启动任务配置 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>
<!--可以循环的 循环5次 间隔10秒-->
<timeCycle>
R5/PT10S
</timeCycle>
</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>
监听定时任务event.JobEventListener:
package event;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 流程监听器 【手动发送一个事件,定义监听自己事件的监听器】
*/
public class JobEventListener implements ActivitiEventListener{
private static final Logger LOGGER = LoggerFactory.getLogger(JobEventListener.class);
@Override
public void onEvent(ActivitiEvent activitiEvent) {
ActivitiEventType eventType = activitiEvent.getType();
/*按名字判断进行监听*/
String name = eventType.name();
if(name.startsWith("TIMER") || name.startsWith("JOB")){
LOGGER.info("监听到JOB义事件 {}\t{}",eventType,activitiEvent.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
单元测试:
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;
import static org.junit.Assert.assertEquals;
/**
* 定时任务和异步执行时间
*/
public class ConfigJobTest {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigJobTest.class);
@Rule
/* public ActivitiRule activitiRule = new ActivitiRule();*///整个流程引擎的启动和创建过程都固定好了
public ActivitiRule activitiRule = new ActivitiRule("activiti_job.cfg.xml");
@Test
@Deployment(resources = {"my-process_job.bpmn20.xml"})//加载流程引擎文件(测试)
public void test() {
//打开MDC记录日志
/*LogMDC.setMDCEnabled(true);*///正常执行是不打印日志
/* ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
assertEquals("Activiti is awesome!", task.getName());
activitiRule.getTaskService().complete(task.getId());*/
/*因定时启动所以流程启动的代码可以注释*/
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());
try {
Thread.sleep(1000*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info("end");
}
}