目录
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
集群 代码
- 纯代码及运行在eclips上运行:download.csdn.net/download/we…
- 在eclips上运行加带有打包的代码:download.csdn.net/download/we…
集群机构图片
数据库表截图
- 这些就是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…
文章持续更新,转发表明出处,方便更新!