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);@Overridepublic 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());}}@Overridepublic 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");}
}
activiti 定时任务和线程池相关推荐
- 11.定时任务定时线程池详解
3.1 新增定时任务池 11.定时任务&定时线程池详解 当我们不用任务框架时,我们想自己写一个定时任务时,我们能想起那个工具类呢?Timer ?还有吗?不知道了,下面我们要讲下Schedu ...
- java中定时任务和线程池_java基于线程池和反射机制实现定时任务完整实例
本文实例讲述了java基于线程池和反射机制实现定时任务的方法.分享给大家供大家参考,具体如下: 主要包括如下实现类: 1. Main类: 任务执行的入口: 调用main方法,开始加载任务配置并执行任务 ...
- @Async 异步任务自定义线程池的配置方法和 @Scheduled 定时任务自定义线程池的配置方式
文章目录 一.定时和异步业务场景描述 二.定时调度任务的实现方式 三.定时调度任务的问题描述 四.定时调度多线程解决方案(方案一) 五.异步多线程程序实现方式 六.定时调度多线程解决方案(方案二) 一 ...
- springboot 定时任务注入线程池
- spring定时任务Scheduled与定时任务线程池配置SchedulingConfigurer ,Java
spring定时任务Scheduled与定时任务线程池配置SchedulingConfigurer ,Java spring默认定时任务的使用 package zhangphil.demo;impor ...
- 高并发之——创建线程池居然有这么多方式...
来自:冰河技术 前言 在Java的高并发领域,线程池一直是一个绕不开的话题.有些童鞋一直在使用线程池,但是,对于如何创建线程池仅仅停留在使用Executors工具类的方式,那么,创建线程池究竟存在哪几 ...
- 手把手教你手动创建线程池
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020,搞个 Mac 玩玩!个人原创+1博客:点击前往,查看更多 作者:IamHYN 链接:https://s ...
- Java的多线程和线程池的使用,你真的清楚了吗?
Java的多线程和线程池的使用 多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务.开启一个线程有4种方式,在下面的文章我将详细的去讲解. 继承Thread 继承Thr ...
- Java—这把线程池ThreadPoolExecutor操作,你学会了吗?
关注微信公众号:CodingTechWork,一起学习进步. 引导 要求:线程资源必须通过线程池提供,不允许在应用自行显式创建线程: 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资 ...
最新文章
- 基于pytorch的模型压缩和模型剪枝Model Prune示例
- dos下 和 批处理中的 for 语句的基本用法
- ngnix的upstream模块配置详解
- 深入解读Service Mesh背后的技术细节
- Ajax在IE浏览器会出现中文乱码解决办法
- “我不看春晚,但想要张小斐同款”
- SQL数据表层面操作(DDL)
- notepad++设置自动刷新文本(中文版/英文版)
- 检测手机用户安装的应用程序是否有使用某权限
- 《Nmap渗透测试指南》—第2章2.8节ICMP Ping Types扫描
- 肌电信号 原始信号 积分_实验室人必看!复杂的色谱峰要如何正确积分?
- mysql之 mysql_config_editor/login-path 登录密码保护
- iTerm2 + Fish 打造高效终端
- 多智能体强化学习之值函数分解:VDN、QMIX、QTRAN系列优缺点分析(转载)
- 【技术综述】一文道尽传统图像降噪方法
- 快手申请快手联盟商选商标,商标注册的申请程序有哪些?
- 【CLP】Conic Linear Programming Duality
- 获取屏幕分辨率和刷新率
- PyQt5 组合键
- install pecl php_pecl安装以前的php版本