c语言sscanf函数的用法是什么
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 官网 查询:使用最新包就好目前最新:
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包的代码
发表评论
暂时没有评论,来抢沙发吧~