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 下载依赖包

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

 

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: DefaultQuartzScheduler
org.quartz.scheduler.instanceid: AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000

org.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 表达式在线生成器可以用 http://cron.qqe2.com/也可以百度搜索
		
		//基于日历执行任务
		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表达式

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

 

Cron 表达式举例

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

 

Cron表达式特殊字符介绍

spring boot maven Quartz 实现 job 任务加 springboot 集成 quartz集群 总结quartz 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: DefaultQuartzScheduler
org.quartz.scheduler.instanceid:AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.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.xml
org.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下载

官网下载 http://www.quartz-scheduler.org/

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

  • quartz-2.4.0-SNAPSHOT 下载完成后解压
  • 这个目录就是文件地址

 

表介绍

 

  • 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 -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4990
Server version: 8.0.15 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

 

集群 代码

 

集群机构图片

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

 

数据库表截图

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

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

 

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

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.super</groupId>
		<artifactId>SuperPortal</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>SupperPortal-Quartz</artifactId>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.15</version>
		</dependency>

		<!--spring quartz依赖 -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.3</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>3.2.3.RELEASE</version>
		</dependency>
		
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<fork>true</fork>
					<mainClass>${start-class}</mainClass>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.2-beta-5</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<mainClass>com.superman.quartz.Quartz_Group_Application</mainClass>
						</manifest>
					</archive>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
				</configuration>
				<executions>
					<execution>
						<id>assemble-all</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>

	</build>

</project>
  • 如果同一台电脑记得换端口
  • 在application.ymlh中配置server:8086

 

集群介绍

  • 1.将数据sql中数据考到数据库中
  • 2.修改quartz配置文件:数据库位置
  • 3.启动
  • 4.调用controller中的创建方法 
  • 5.ok

 

 

 

 

文章出处博主主页:https://blog.csdn.net/weixin_42749765

 

文章持续更新,转发表明出处,方便更新!