spring boot maven Quartz 实现 job 任务加 springboot 集成 quartz集群 总结quartz Cron 语法介绍 以及采坑记录

网友投稿 370 2022-09-07

spring boot maven Quartz 实现 job 任务加 springboot 集成 quartz集群 总结quartz Cron 语法介绍 以及采坑记录

目录

​​介绍:​​

​​quartz maven 下载依赖包​​

​​quartz 主要使用的几个对象和接口:​​

​​下面介绍一些实例:​​

​​job类​​

​​执行类​​

​​总结​​

​​Trigger类介绍​​

​​ CronTrigger的使用语法介绍​​

​​Cron表达式​​

​​Cron 表达式举例​​

​​Cron表达式特殊字符介绍​​

​​quartz.properties 详细点的版本​​

​​配置集群数据库sql下载​​

​​表介绍​​

​​采坑记录:​​

​​Unknown character set index for field '255' received from server​​

​​The server time zone value 'Öйú±ê׼ʱ¼ä' is unrec​​

介绍:

为了做定时任务 方便 专门看了下 spring  中的quartz 技术顺便做个总结方便以后使用

quartz maven 下载依赖包

maven 官网 查询:​​使用最新包就好目前最新:

org.quartz-scheduler quartz 2.3.0

quartz 主要使用的几个对象和接口:

1.一个实现 Job的 类  HelloJob implements Job(必备)

public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { //在这里做任务 }}

2.调用时使用 JobDetail   new job 一个 hellojob.class(必备)

JobDetail jobd = JobBuilder.newJob(HelloJob.class).withIdentity("job001").build();

3.一个Trigger 类 设置一些触发的规则(必备)

CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger() .withIdentity("trigger001", "group1") .withSchedule( CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) .build();

4.最后一个SchedulerFactory  用来启动调用 (必备)

SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.start(); scheduler.scheduleJob(jobd,trigger);

5.这里还有一个配置文件quartz.properties 这个可以自己设置也可以使用引入包自带的,如果需要配置集群等内容就自己建一个他可以自动扫描,只要在项目中就ok,别把目录放得多太深(可不必备)

# Default Properties file for use by StdSchedulerFactory# to create a Quartz Scheduler Instance, if a different# properties file is not explicitly specified.#org.quartz.scheduler.instanceName: DefaultQuartzSchedulerorg.quartz.scheduler.instanceid: AUTOorg.quartz.scheduler.rmi.export: falseorg.quartz.scheduler.rmi.proxy: falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction: falseorg.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount: 10org.quartz.threadPool.threadPriority: 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: trueorg.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

下面介绍一些实例:

job类

package com.superman.quartz;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobKey;import org.quartz.Trigger;/** * job接口实现类 * * @author yushen * */public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { Date d = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("now time:"+sf.format(d)); System.out.println("hello word! "); //获取时间信息 // Trigger crt = context.getTrigger();// System.out.println("start time:"+crt.getStartTime());// System.out.println("start time:"+crt.getEndTime());// JobKey jok = crt.getJobKey();// System.out.println(jok.getGroup()+jok.getName()); // //通过jobexecutioncontext 获取key 信息// JobKey key = context.getJobDetail().getKey();// //获取 jobdetial key 中内容// System.out.println(key.getName()+":"+key.getGroup());// // 获取 trigger 中的内容// TriggerKey trkey = context.getTrigger().getKey();// System.out.println("trggerkey"+trkey.getName()+trkey.getGroup());// // //通过上下文获取jobdetail 数据// JobDataMap datamap = context.getJobDetail().getJobDataMap();// //获取上下文 trigger 的数据// JobDataMap tdatamap = context.getTrigger().getJobDataMap();// // System.out.println("---+----"+datamap.getFloat("FloatJobValue"));// System.out.println("---+----"+tdatamap.getDouble("DoubleTrggervalue"));// // // //获取全部数据对象内容// JobDataMap ftdatamap = context.getMergedJobDataMap();// System.out.println("---+----"+ftdatamap.getDouble("DoubleTrggervalue"));// } }

执行类

package com.superman.quartz;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.CronScheduleBuilder;import org.quartz.CronTrigger;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;public class HelloScheduler { public static void main(String[] args) throws SchedulerException, InterruptedException { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 创建jobdetail 实例和执行类绑定// JobDetail jobd = JobBuilder.newJob(HelloJob.class)// .withIdentity("job001", "group1").build(); JobDetail jobd = JobBuilder.newJob(HelloJob.class) .withIdentity("job001")// .usingJobData("message","hellomyjob001")//添加参数// .usingJobData("FloatJobValue",3.21F) .build(); // System.out.println(jobd.getKey().getGroup());// System.out.println(jobd.getKey().getName());// System.out.println(jobd.getJobClass().getName()); // Date d = new Date();// Date d2 = new Date();// d.setTime(d.getTime()+3000);//开始时间// d2.setTime(d2.getTime()+6000);//结束时间 // 创建一个triger 实例 定义job执行触发器// Trigger trigger = TriggerBuilder// .newTrigger()// .withIdentity("trigger001", "group1") .startAt(d)//设置开始时间 .endAt(d2)//设置结束时间 .usingJobData("message","hellomytrigger") .usingJobData("DoubleTrggervalue",2.0D)// .startNow()// .withSchedule(// SimpleScheduleBuilder.simpleSchedule().// withIntervalInSeconds(2).repeatForever())// .build(); // Date d = new Date();// Date d2 = new Date();// d.setTime(d.getTime()+4000);//开始时间// d2.setTime(d2.getTime()+6000);//结束时间 //SimpleTrigger 时间 频率 //距离当前时间4秒后执行每俩秒执行// SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder// .newTrigger()// .withIdentity("trigger001", "group1")// .startAt(d)//4秒后开始// //.endAt(d2)//结束时间 优先于其他重复平度// .withSchedule(// SimpleScheduleBuilder// .simpleSchedule().// withIntervalInSeconds(2)//每俩秒执行一次// .withRepeatCount(3))//执行三次// .build(); //cron表达式 秒 分 小时 日 月 周 年 //1.2017年每天10点15分出发一次 //0 15 10 ? * * 2017 //2.每天14点到14点59分出发 一级18点到18点59,每个5秒执行一次 //0/5 * 14,18 * * ? //每周一到周五10点15出发一次 //没月最后一天10点15出发一次 //每月第三个周五的10点15出发一次 //L OR W 可以一起用 //周字段 不区分大小写 //cron 表达式在线生成器可以用 //基于日历执行任务 CronTrigger trigger = (CronTrigger)TriggerBuilder .newTrigger() .withIdentity("trigger001", "group1") .withSchedule( CronScheduleBuilder .cronSchedule("0/2 * * * * ?") ) .build(); Date d0 = new Date(); //创建scheduler 用来调用trigger and jobdetail SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.start(); System.out.println("----------now time:"+sf.format(d0)); scheduler.scheduleJob(jobd,trigger); //scheduler 执行俩秒后挂起 Thread.sleep(3000); scheduler.standby();//挂起 //挂起三秒后继续执行 Thread.sleep(5000); scheduler.start();//启动 // scheduler.shutdown();//测点停止彻底停止()马上停止// scheduler.shutdown(true);//所有执行完毕后结束 }}

总结

第一步创建一个xx代办类实现Job的类接口实现继承的方法execute方法在方法中编写自己的job任务在另外一个类中通过 JobDetail  关联 xx代办类提供trigger类设置 job 任务规律和方式时间等通过scheduler 方法启动关闭重启暂停等

Trigger类介绍

trigger 类包含以下类常用Trigger //普通类型SimpleTrigger  基于频率等CronTrigger 基于时间设置规律

CronTrigger的使用语法介绍

Cron表达式

Cron 表达式举例

Cron表达式特殊字符介绍

quartz.properties 详细点的版本

# Default Properties file for use by StdSchedulerFactory# to create a Quartz Scheduler Instance, if a different# properties file is not explicitly specified.## ===========================================================================# Configure Main Scheduler Properties 调度器属性# ===========================================================================org.quartz.scheduler.instanceName: DefaultQuartzSchedulerorg.quartz.scheduler.instanceid:AUTOorg.quartz.scheduler.rmi.export: falseorg.quartz.scheduler.rmi.proxy: falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction: false# =========================================================================== # Configure ThreadPool 线程池属性 # ===========================================================================#线程池的实现类(一般使用SimpleThreadPool即可满足几乎所有用户的需求)org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool#指定线程数,至少为1(无默认值)(一般设置为1-100直接的整数合适)org.quartz.threadPool.threadCount: 10#设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY 10,最小为Thread.MIN_PRIORITY 1,默认为5)org.quartz.threadPool.threadPriority: 5#设置SimpleThreadPool的一些属性#设置是否为守护线程#org.quartz.threadpool.makethreadsdaemons = false#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true#org.quartz.threadpool.threadsinheritgroupofinitializingthread=false#线程前缀默认值是:[Scheduler Name]_Worker#org.quartz.threadpool.threadnameprefix=swhJobThead;# 配置全局监听(TriggerListener,JobListener) 则应用程序可以接收和执行 预定的事件通知# ===========================================================================# Configuring a Global TriggerListener 配置全局的Trigger监听器# MyTriggerListenerClass 类必须有一个无参数的构造函数,和 属性的set方法,目前2.2.x只支持原始数据类型的值(包括字符串)# ===========================================================================#org.quartz.triggerListener.NAME.class = com.swh.MyTriggerListenerClass#org.quartz.triggerListener.NAME.propName = propValue#org.quartz.triggerListener.NAME.prop2Name = prop2Value# ===========================================================================# Configuring a Global JobListener 配置全局的Job监听器# MyJobListenerClass 类必须有一个无参数的构造函数,和 属性的set方法,目前2.2.x只支持原始数据类型的值(包括字符串)# ===========================================================================#org.quartz.jobListener.NAME.class = com.swh.MyJobListenerClass#org.quartz.jobListener.NAME.propName = propValue#org.quartz.jobListener.NAME.prop2Name = prop2Value# =========================================================================== # Configure JobStore 存储调度信息(工作,触发器和日历等)# ===========================================================================# 信息保存时间 默认值60秒org.quartz.jobStore.misfireThreshold: 60000#保存job和Trigger的状态信息到内存中的类org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore# =========================================================================== # Configure SchedulerPlugins 插件属性 配置# ===========================================================================# 自定义插件 #org.quartz.plugin.NAME.class = com.swh.MyPluginClass#org.quartz.plugin.NAME.propName = propValue#org.quartz.plugin.NAME.prop2Name = prop2Value#配置trigger执行历史日志(可以看到类的文档和参数列表)org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy} org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9} #配置job调度插件 quartz_jobs(jobs and triggers内容)的XML文档 #加载 Job 和 Trigger 信息的类 (1.8之前用:org.quartz.plugins.xml.JobInitializationPlugin)org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin#指定存放调度器(Job 和 Trigger)信息的xml文件,默认是classpath下quartz_jobs.xmlorg.quartz.plugin.jobInitializer.fileNames = my_quartz_job2.xml #org.quartz.plugin.jobInitializer.overWriteExistingJobs = false org.quartz.plugin.jobInitializer.failOnFileNotFound = true #自动扫描任务单并发现改动的时间间隔,单位为秒org.quartz.plugin.jobInitializer.scanInterval = 10#覆盖任务调度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情况org.quartz.plugin.jobInitializer.wrapInUserTransaction = false# =========================================================================== # Sample configuration of ShutdownHookPlugin ShutdownHookPlugin插件的配置样例# ===========================================================================#org.quartz.plugin.shutdownhook.class = \org.quartz.plugins.management.ShutdownHookPlugin#org.quartz.plugin.shutdownhook.cleanShutdown = true## Configure RMI Settings 远程服务调用配置##如果你想quartz-scheduler出口本身通过RMI作为服务器,然后设置“出口”标志true(默认值为false)。#org.quartz.scheduler.rmi.export = false#主机上rmi注册表(默认值localhost)#org.quartz.scheduler.rmi.registryhost = localhost#注册监听端口号(默认值1099)#org.quartz.scheduler.rmi.registryport = 1099#创建rmi注册,false/never:如果你已经有一个在运行或不想进行创建注册# true/as_needed:第一次尝试使用现有的注册,然后再回来进行创建# always:先进行创建一个注册,然后再使用回来使用注册#org.quartz.scheduler.rmi.createregistry = never#Quartz Scheduler服务端端口,默认是随机分配RMI注册表#org.quartz.scheduler.rmi.serverport = 1098#true:链接远程服务调度(客户端),这个也要指定registryhost和registryport,默认为false# 如果export和proxy同时指定为true,则export的设置将被忽略#org.quartz.scheduler.rmi.proxy = false

ok到这里就 可用使用自己的quartz了

配置集群数据库sql下载

官网下载 ​​下载完成后解压这个目录就是文件地址

表介绍

QRTZ_CALENDARS    以 Blob 类型存储 Quartz 的 Calendar 信息QRTZ_CRON_TRIGGERS    存储 Cron Trigger,包括 Cron 表达式和时区信息QRTZ_FIRED_TRIGGERS    存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息QRTZ_PAUSED_TRIGGER_GRPS    存储已暂停的 Trigger 组的信息QRTZ_SCHEDULER_STATE    存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是用于一个集群中)QRTZ_LOCKS    存储程序的非观锁的信息(假如使用了悲观锁)QRTZ_JOB_DETAILS    存储每一个已配置的 Job 的详细信息QRTZ_SIMPLE_TRIGGERS    存储简单的 Trigger,包括重复次数,间隔,以及已触的次数QRTZ_BLOG_TRIGGERS    Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)QRTZ_TRIGGER_LISTENERS    存储已配置的 TriggerListener 的信息QRTZ_TRIGGERS    存储已配置的 Trigger 的信息

采坑记录:

Unknown character set index for field '255' received from server

更换mysql 版本  mysql  版本高,项目中引入的jar 版本低,加高版本

The server time zone value 'Öйú±ê׼ʱ¼ä' is unrec

C:\Users\yushen>mysql -u root -pEnter password: ******Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 4990Server version: 8.0.15 MySQL Community Server - GPLCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show variables like '%time_zne%';Empty set, 1 warning (0.00 sec)mysql> set global time_zone='+8:00';Query OK, 0 rows affected (0.07 sec)mysql> show variables like '%time_zne%';Empty set, 1 warning (0.00 sec)mysql>

ok

集群 代码

纯代码及运行在eclips上运行:​​javascript:void(0)​​在eclips上运行加带有打包的代码:​​javascript:void(0)​​

集群机构图片

数据库表截图

这些就是quartz的表结构 通过 代码中的quartz.sql文件在数据库中自己运行一下生成出来

献上pom.xml及打jar包的代码

标签:函数 文件 接口
上一篇:卖车还是卖身?汽车公司现低俗营销,顾客买车可选不同服务!
下一篇:mvn 命令 安装 oracle 驱动
相关文章

 发表评论

暂时没有评论,来抢沙发吧~