【Activiti系列学习】--19.命令拦截器与作业执行器

一、命令拦截器

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>
发布了66 篇原创文章 · 获赞 32 · 访问量 8526

猜你喜欢

转载自blog.csdn.net/shao_yc/article/details/105329911