activiti 定时任务和线程池

配置 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");
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值