以下就对两种定时任务框架进行大略解释。
Quartz传送门github地址:https://github.com/quartz-scheduler/quartz
Maven坐标
<!-- Quartz Core --><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version></dependency>
可以查看jar包的依赖情形如下:
如果不是maven项目,单独下载jar包利用的情形,不要漏掉jar包;可通过官网下载的办法获取到所有的jar包;
官网不知道怎么回事儿,超级慢;
我一样平常的做法是,本地建立一个单独的maven项目,加入干系maven依赖,然后通过下面的maven命令获取到所有pom.xml文件中的jar包;然后再复制到自己须要放的地方;
mvn dependency:copy-dependencies -DoutputDirectory=lib
配置文件终极编译后的位置:WEB-INF/classes/quartz.properties
下面是一个最基本的配置项内容:
org.quartz.scheduler.instanceName = MySchedulerorg.quartz.threadPool.threadCount = 3org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
个中
此配置创建的调度器有以下特点:
org.quartz.scheduler.instanceName -这个调度程序的名称将是“MyScheduler”。org.quartz.threadPool.threadCount- 线程池中有3个线程,这意味着最多可以同时运行3个任务。org.quartz.jobStore.class - Quartz的所有数据,比如任务和触发器的细节,都保存在内存中(而不是数据库中)。纵然你有一个数据库,并且想要在Quartz上利用它,我建议你先让Quartz和RamJobStore一起利用,然后再用数据库打开一个全新的维度。任务信息任务信息处理类实现了org.quartz.Job 接口;如下
public class HelloJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("hello @ " + LocalDateTime .now() .format(DateTimeFormatter .ofPattern("yyyyMMddHHmmss"))); }}
任务调度一旦利用StdSchedulerFactory.getDefaultScheduler()得到一个调度器,您的运用程序将不会终止,直到您调用schedul. shutdown(),由于将有活动线程。
把稳代码示例中的静态导入 ;
这些将不才面的代码示例中发挥浸染。
更详细地配置文件解释在这儿:
https://github.com/quartz-scheduler/quartz/blob/master/docs/configuration.adoc
import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;import static org.quartz.JobBuilder.;import static org.quartz.TriggerBuilder.;import static org.quartz.SimpleScheduleBuilder.;public class QuartzTest { public static void main(String[] args) throws InterruptedException { try { // Grab the Scheduler instance from the Factory Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // and start it off scheduler.start(); // define the job and tie it to our HelloJob class JobDetail job = newJob(HelloJob.class) .withIdentity("job1", "group1") .build(); // Trigger the job to run now, and then repeat every 40 seconds Trigger trigger = newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build(); // Tell quartz to schedule the job using our trigger scheduler.scheduleJob(job, trigger); Thread.sleep(60 60 1000); scheduler.shutdown(); } catch (SchedulerException se) { se.printStackTrace(); } }}
集群下的任务调度数据库表表文件在jar包的org.quartz.impl.jdbcjobstore,可根据数据库类型选择不同的数据库文件;
配置文件
quartz也供应了数据库方面的任务配置及集群下的任务处理;
#==============================================================#Configure Main Scheduler Properties#org.quartz.scheduler.instanceName【相同业务支配保持该配置同等】#==============================================================org.quartz.scheduler.instanceName = quartzSchedulerorg.quartz.scheduler.instanceId = AUTO#==============================================================#Configure JobStore#org.quartz.jobStore.tablePrefix:表名前缀#org.quartz.jobStore.dataSource:对应org.quartz.dataSource.xxx下面的配置信息#==============================================================org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.isClustered = trueorg.quartz.jobStore.clusterCheckinInterval = 10000org.quartz.jobStore.dataSource = myDS#==============================================================#Configure DataSource#可以通过配置详细数据源的办法,也可以通过配置连接池的办法#org.quartz.dataSource.qzDS.jndiURL = java:/comp/env/jdbc/mydb#我是用的weblogic中间件直接配置weblogic连接池的jndi即可,例如我的jndi名称为jdbc/isp#因此我的配置如下:#org.quartz.dataSource.qzDS.jndiURL=jdbc/isp##org.quartz.dataSource.myDS.driver为数据库驱动名称,#根据项目中实际须要修正为自己的数据库驱动名称即可#==============================================================org.quartz.dataSource.myDS.driver = com.ibm.db2.jcc.DB2Driverorg.quartz.dataSource.myDS.URL = org.quartz.dataSource.myDS.user = org.quartz.dataSource.myDS.password = org.quartz.dataSource.myDS.maxConnections = 30#==============================================================#Configure ThreadPool#==============================================================org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 5org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
crontab任务创建
// 构建job信息JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(jobName, jobGroup) .withDescription(description) .build();// 表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);scheduleBuilder.withMisfireHandlingInstructionDoNothing();// 按新的cronExpression表达式构建一个新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(scheduleBuilder) .build();if (!params.isEmpty()) { // 放入参数,运行时的方法可以获取 jobDetail.getJobDataMap().putAll(params);}Date date = scheduler.scheduleJob(jobDetail, trigger);
Xxl-job解释XXL-JOB是一个分布式任务调度平台,其核心设计目标是开拓迅速、学习大略、轻量级、易扩展。
传送门官网:https://www.xuxueli.com/xxl-job/
gitee传送门:https://gitee.com/xuxueli0323/xxl-job/tree/master
maven坐标
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core --><dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version></dependency>
快速入门git clone https://gitee.com/xuxueli0323/xxl-job.git
获得到目录构造
初始化数据库
/xxl-job/doc/db/tables_xxl_job.sql
编译源码xxl-job-admin:调度中央xxl-job-core:公共依赖xxl-job-executor-samples:实行器Sample示例(选择得当的版本实行器,可直策应用,也可以参考其并将现有项目改造成实行器):xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理实行器,推举这种办法;:xxl-job-executor-sample-frameless:无框架版本;
配置支配调度中央调度中央项目:xxl-job-admin浸染:统一管理任务调度平台上的调度任务,卖力触发调度实行,并且供应任务管理平台。
调度中央配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties【修正数据库配置】
/xxl-job/xxl-job-admin/src/main/resources/logback.xml
完成上述修正后,然后运行XxlJobAdminApplication
运行成功后通过浏览器打开:http://localhost:8080/xxl-job-admin/,用户名及密码:admin/123456
至此“调度中央”项目已经支配成功。
配置支配实行器项目实行器项目:xxl-job-executor-sample-springboot (供应多种版本实行器供选择,现以 springboot 版本为例,可直策应用,也可以参考其并将现有项目改造成实行器)浸染:卖力吸收“调度中央”的调度并实行;可以直接支配实行器,也可以将实行器集成到现有业务项目中。
实行器配置配置文件地址:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/
application.properties
修正:xxl.job.executor.logpath为本地路径
logback.xml
修正日志路径为本地路径
新建任务触发实行请点击任务右侧 “实行” 按钮,可手动触发一次任务实行(常日情形下,通过配置Cron表达式进行任务调度触发)。
查看日志请点击任务右侧 “日志” 按钮,可前往任务日志界面查看任务日志。在任务日志界面中,可查看该任务的历史调度记录以及每一次调度的任务调度信息、实行参数和实行信息。运行中的任务点击右侧的“实行日志”按钮,可进入日志掌握台查看实时实行日志。
磁盘上的日志文件路径在xxl.job.executor.logpath
更多
根本配置:- 实行器:任务的绑定的实行器,任务触发调度时将会自动创造注册成功的实行器, 实现任务自动创造功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个实行器, 可在 "实行器管理" 进行设置;- 任务描述:任务的描述信息,便于任务管理;- 卖力人:任务的卖力人;- 报警邮件:任务调度失落败时邮件关照的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;触发配置:- 调度类型: 无:该类型不会主动触发调度; CRON:该类型将会通过CRON,触发任务调度; 固定速率:该类型将会以固定速率,触发任务调度;按照固定的间隔韶光,周期性触发; 固定延迟:该类型将会以固定延迟,触发任务调度;按照固定的延迟韶光,早年次调度结束后开始打算延迟韶光,到达延迟韶光后触发下次调度;- CRON:触发任务实行的Cron表达式;- 固定速率:固件速率的韶光间隔,单位为秒;- 固定延迟:固件延迟的韶光间隔,单位为秒;任务配置:- 运行模式: BEAN模式:任务以JobHandler办法掩护在实行器端;须要结合 "JobHandler" 属性匹配实行器中任务; GLUE模式(Java):任务以源码办法掩护在调度中央;该模式的任务实际上是一段继续自IJobHandler的Java类代码并 "groovy" 源码办法掩护,它在实行器项目中运行,可利用@Resource/@Autowire注入实行器里中的其他做事; GLUE模式(Shell):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "shell" 脚本; GLUE模式(Python):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "python" 脚本; GLUE模式(PHP):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "php" 脚本; GLUE模式(NodeJS):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "nodejs" 脚本; GLUE模式(PowerShell):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "PowerShell" 脚本;- JobHandler:运行模式为 "BEAN模式" 时生效,对应实行器中新开拓的JobHandler类“@JobHandler”表明自定义的value值;- 实行参数:任务实行所需的参数; 高等配置:- 路由策略:当实行器集群支配时,供应丰富的路由策略,包括; FIRST(第一个):固定选择第一个机器; LAST(末了一个):固定选择末了一个机器; ROUND(轮询):; RANDOM(随机):随机选择在线的机器; CONSISTENT_HASH(同等性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。 LEAST_FREQUENTLY_USED(最不常常利用):利用频率最低的机器优先当选举; LEAST_RECENTLY_USED(最近最久未利用):最久未利用的机器优先当选举; FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标实行器并发起调度; BUSYOVER(劳碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标实行器并发起调度; SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器实行一次任务,同时系统自动通报分片参数;可根据分片参数开拓分片任务;- 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务实行结束并且实行成功时,将会触发子任务ID所对应的任务的一次主动调度。- 调度过期策略: - 忽略:调度过期后,忽略过期的任务,从当前韶光开始重新打算下次触发韶光; - 立即实行一次:调度过期后,立即实行一次,并从当前韶光开始重新打算下次触发韶光;- 壅塞处理策略:调度过于密集实行器来不及处理时的处理策略; 单机串行(默认):调度要求进入单机实行器后,调度要求进入FIFO行列步队并以串行办法运行; 丢弃后续调度:调度要求进入单机实行器后,创造实行器存在运行的调度任务,本次要求将会被丢弃并标记为失落败; 覆盖之前调度:调度要求进入单机实行器后,创造实行器存在运行的调度任务,将会终止运行中的调度任务并清空行列步队,然后运行本地调度任务;- 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;- 失落败重试次数;支持自定义任务失落败重试次数,当任务失落败时将会按照预设的失落败重试次数主动进行重试;
你看,奇怪的知识又增加了!