内容概况:

异步执行配置相关:

asyncExecutorActivate:这个属性是激活作业执行器,它的默认参数是false,只有设为true,activiti启动的时候才会开启线程池去扫描定时操作的任务

asyncExecutorXXX:这些属性的操作都是基于asyncExecutor这样一个前缀,后面有各种类型的属性配置,(其实里面的属性配置大多都是与线程池、队列相关的配置)

(很重要的配置)asyncExecutor:asyncExecutor的bean的配置,它本身是一个接口,用它也可以配置自定义的线程池。

如何自定义一个线程池?

在设置了核心线程数的情况下,比如设为了5,那么在开启了五个线程之后,有新的任务来了之后,回去检测核心线程数是否都在执行任务中,如果是,那么新的请求就会放在队列里去等待,

等到核心线程中有一个线程执行完了自己的任务,那么排在队列最前面的这个请求,回去获取这个线程,然后去执行。那么当队列一直有新的请求加入时,负载过大,超过了队列大小的时候,最大线程数就会起作用了,新建线程至最大线程数,来一起执行超过容量的新请求。  当三个都满了以后,就会拒绝服务、请求。


作业执行器的配置:

这里要说明的是R5/P1DT1H, / 后面的指时间间隔,1D表示一天,是24个小时,而1H表示一小时加起来就是25个小时。R5是指执行次数为5,这个属性的含义是:在流程启动时开始计时,25小时后第一次执行这个指定事件, 并且每隔25小时执行一次,总共执行次数为5次(ps:包含第一次执行在内)。


流程定义文件my-process_job.bpmn20.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" />-->
<!-- 若为true则开启记录事件、节点的状态,完成后将完成状态插入数据库,若为false则关闭,不记录 -->
<property name="enableDatabaseEventLogging" value="true"/> <!--打开异步激活器激活异步,如果不配置线程池就会使用它的默认线程池-->
<property name="asyncExecutorActivate" value="true"/>
<!--如果使用我们自己定义的线程池,需要先定义一个执行器-->
<property name="asyncExecutor" ref="asyncExecutor" />
<!-- 配置事件监听器 -->
<property name="eventListeners">
<list>
<bean class="com.yy.avtiviti.helloworld.event.JobEventListener"/>
</list>
</property>
</bean>
<!-- 执行器默认使用DefaultAsyncJobExecutor -->
<bean id="asyncExecutor"
class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
<!-- 需要配置一个服务 基于spring去配置它 -->
<property name="executorService" ref="executorService"/>
</bean>
<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
<property name="threadNamePrefix" value="activiti-job-"/>
<property name="corePoolSize" value="10"/>
<property name="maxPoolSize" value="20"/>
<property name="queueCapacity" value="100"/>
<!-- 设置当线程池满了时候的拒绝策略,这里是使用的默认策略,抛出异常 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
</property>
</bean>
<bean id="commandInvoker" class="com.yy.avtiviti.helloworld.intercept.MDCCommandInvoker"/> </beans>

设置一个监听器JobEventListener,以便测试观察:

public class JobEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(JobEventListener.class); //简单的完成一下监听器的效果
@Override
public void onEvent(ActivitiEvent event) {
ActivitiEventType eventType = event.getType();
String name = eventType.name(); if (name.startsWith("TIMER") || name.startsWith("JOB")){
LOGGER.info("监听到job事件 {} \t {}",eventType,event.getProcessInstanceId());
}
} @Override
public boolean isFailOnException() {
return false;
}
}

编写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" />-->
<!-- 若为true则开启记录事件、节点的状态,完成后将完成状态插入数据库,若为false则关闭,不记录 -->
<property name="enableDatabaseEventLogging" value="true"/> <!--打开异步激活器激活异步,如果不配置线程池就会使用它的默认线程池-->
<property name="asyncExecutorActivate" value="true"/>
<!--如果使用我们自己定义的线程池,需要先定义一个执行器-->
<property name="asyncExecutor" ref="asyncExecutor" />
<!-- 配置事件监听器 -->
<property name="eventListeners">
<list>
<bean class="com.yy.avtiviti.helloworld.event.JobEventListener"/>
</list>
</property>
</bean>
<!-- 执行器默认使用DefaultAsyncJobExecutor -->
<bean id="asyncExecutor"
class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
<!-- 需要配置一个服务 基于spring去配置它 -->
<property name="executorService" ref="executorService"/>
</bean>
<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
<property name="threadNamePrefix" value="activiti-job-"/>
<property name="corePoolSize" value="10"/>
<property name="maxPoolSize" value="20"/>
<property name="queueCapacity" value="100"/>
<!-- 设置当线程池满了时候的拒绝策略,这里是使用的默认策略,抛出异常 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
</property>
</bean>
<bean id="commandInvoker" class="com.yy.avtiviti.helloworld.intercept.MDCCommandInvoker"/> </beans>

编写测试类configJobTest :

public class configJobTest {
private static final Logger LOGGER = LoggerFactory.getLogger(configTest.class); @Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti_job.cfg.xml");//传入自定义的mdc配置文件 @Test
@Deployment(resources = {"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*10);
LOGGER.info("end"); }
}

测试结果如下:

Activiti6作业执行器Job Executor配置(学习笔记)的更多相关文章

  1. Chapter 2. OpenSSL的安装和配置学习笔记

    Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...

  2. redis 安装配置学习笔记

    redis 安装配置学习笔记 //wget http://download.redis.io/releases/redis-2.8.17.tar.gz 下载最新版本 wget http://downl ...

  3. 作业执行器Job Executor

    Job Executor 激活作业执行器 AsyncExecutor是一个组件,它管理线程池,来触发计时器和其他异步任务.其他实现也是可能的(例如使用消息队列,请参阅用户指南的高级部分). 默认情况下 ...

  4. Elasticsearch的配置学习笔记

    文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器.它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的. ...

  5. Windows+Nginx+Tomcat整合的安装与配置学习笔记

    以下全部是nginx在window7下运行的: nginx学习总结: 我的是放在F盘 1.启动:F:\nginx-1.10.2\nginx-1.10.2>start nginx.exe(找到相应 ...

  6. Hive0.11安装配置学习笔记

    转:http://springsfeng.iteye.com/blog/1734517 1 . 首先请安装好MySQL并修改root账户密码,使用root账户执行下面命令:  su - root    ...

  7. php的具体配置学习笔记

    1.将php配置为apache的一个模块,使用loadmodule指令完成. 2.写下面的语句,此外需强调的是,每次配置都需要重新启动apache 3.php文件,要指定将其php模块来处理 4.PH ...

  8. linux配置学习笔记(一):如何提高ssh连接的速度

    服务器端sshd配置文件 /etc/ssh/sshd_config 看是否有如下的两条配置条目 GSSAPIAuthentication no UseDNS no 如果前面带#,请把#删掉,或者新添加 ...

  9. Executor框架学习笔记

    Java中的线程即是工作单元也是执行机制,从JDK 5后,工作单元与执行机制被分离.工作单元包括Runnable和Callable,执行机制由JDK 5中增加的java.util.concurrent ...

随机推荐

  1. C# 应用Excel条件格式(一)

    Excel中的条件格式功能是个十分强大且方便的功能,通过对使用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种格式,如此一来,也在大大提高了表格的 ...

  2. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  3. java-自定义数据排序

    导读:由于基本类型的数据都实现了一个共同的接口java.lang.Comparable接口,都实现了该接口下面的compareTo()方法,因此想要利用面向对象实现现实生活中的一些情景再现,比如新闻根 ...

  4. 如何程序化的构造Hibernate配置 // How to initialize Hibernate programmably

    Java为什么被人诟病,因为一切都是过度设计.Hibernate其实就是实现了一套JPA的ORM,不过用极度冗赘的配置方式,nodejs Sequelize.js,甚至Python SQLAlchem ...

  5. 集成Android人脸识别demo分享

    本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...

  6. 使用Ajax轮询模拟简单的站内信箱(消息管理)功能

    前一段时间项目需要写一个类似于站内信箱的消息管理的功能,由于对前端不是很熟悉,刚开始不知道怎么做,后来看了网上的方案,现模拟一个非常简单的消息管理. 我们首先看一下最终效果的样式,就是非常简单的一个样 ...

  7. ASP.NET Zero--Migration控制台应用程序

    Migration控制台应用程序 AspNet Zero包含一个工具Migrator.exe,用于轻松迁移数据库.您可以运行此应用程序来创建/迁移host和租户数据库. 该应用程序从它自己的appse ...

  8. c/c++ 网络编程 getaddrinfo 函数

    网络编程 getaddrinfo 函数 解析网址,返回IP地址. 例子: #include <iostream> #include <string.h> #include &l ...

  9. 【PAT】A1034Head of a Gang

    昨天准备学完图相关的知识,但是学起来挺懵的,理解起来不难,但自己一回想,又什么都想不起来. 翻来覆去看图的遍历,还是觉得有点没到位. 所以做题来检测一下,果然学和自己做是两码事. 先看的书,又看的柳婼 ...

  10. 黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号

    <环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...