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

382 阅读10分钟

目录

介绍:

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 官网 查询:mvnrepository.com/
  • 查询quartz 使用最新包就好
  • 目前最新:
<!-- 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表达式

 

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: 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下载

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

  • 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

 

集群 代码

 

集群机构图片

 

数据库表截图

  • 这些就是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

 

 

 

 

文章出处博主主页:blog.csdn.net/weixin_4274…

 

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