quartz mysql 分布式_Quartz Spring分布式集群搭建Demo

本文介绍了如何在Spring 4.3.5环境中使用Quartz 2.2.3进行分布式集群配置,包括数据库建表、配置文件详解、工具类开发及实际操作步骤。重点展示了如何添加和删除任务,以及如何通过URL访问测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:关于单节点的Quartz使用在这里不做详细介绍,直接进阶为分布式集群版的

1.准备工作:

使用环境Spring4.3.5,Quartz2.2.3,持久化框架JDBCTemplate

pom文件如下

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.dzpykj

quartz-test

0.0.1-SNAPSHOT

war

UTF-8

4.3.5.RELEASE

org.quartz-scheduler

quartz

2.2.3

javax.servlet

javax.servlet-api

3.0.1

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-expression

${spring.version}

org.springframework

spring-core

${spring.version}

org.springframework

spring-web

${spring.version}

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-context

${spring.version}

org.springframework

spring-beans

${spring.version}

org.springframework

spring-aop

${spring.version}

org.springframework

spring-aspects

${spring.version}

org.springframework

spring-orm

${spring.version}

org.springframework

spring-test

${spring.version}

test

mysql

mysql-connector-java

5.1.38

commons-pool

commons-pool

1.6

commons-dbcp

commons-dbcp

1.4

org.springframework

spring-tx

4.3.5.RELEASE

org.springframework

spring-jdbc

4.3.5.RELEASE

org.apache.commons

commons-lang3

3.7

org.apache.maven.plugins

maven-war-plugin

2.6

maven-compiler-plugin

3.5.1

1.8

1.8

UTF-8

qt

2.数据库建表:11张

官网下载2.2.3地址:http://www.quartz-scheduler.org/downloads/

下载完后将下图的SQL文件中的语句拿到数据库执行

7a87c7707807a5c5bf6209329f89248a.png

3.将该数据库配置到Quartz的配置文件quartz.properties中

org.quartz.scheduler.instanceName = TestScheduler1

org.quartz.scheduler.instanceId = AUTO

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.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.dataSource = myDS

org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate

org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.maxMisfiresToHandleAtATime=10

org.quartz.jobStore.isClustered = true

org.quartz.jobStore.clusterCheckinInterval = 10000

org.quartz.dataSource.myDS.driver =com.mysql.jdbc.Driver

org.quartz.dataSource.myDS.URL =jdbc\:mysql\://127.0.0.1\:3306/quartz_test?useUnicode\=true&characterEncoding\=utf8&autoReconnect\=true

org.quartz.dataSource.myDS.user =root

org.quartz.dataSource.myDS.password =root

org.quartz.dataSource.myDS.maxConnections = 5

4.配置applicationContext-quartz.xml文件

5.建工具类

packagecom.dzpykj.plugins.quartz.dynamic;import staticorg.quartz.CronScheduleBuilder.cronSchedule;import staticorg.quartz.JobBuilder.newJob;import staticorg.quartz.TriggerBuilder.newTrigger;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.List;importorg.quartz.CronTrigger;importorg.quartz.JobDetail;importorg.quartz.JobKey;importorg.quartz.ObjectAlreadyExistsException;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.quartz.SchedulerFactory;importorg.quartz.TriggerKey;importorg.quartz.impl.StdSchedulerFactory;importorg.springframework.jdbc.core.JdbcTemplate;public classQuartzTaskUtils {public staticString addTask(String jobName, String jobGroupName, String triggerName, String triggerGroupName,

String cronExp, Class jobClass, JdbcTemplate jdbcTemplate) {try{

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

SchedulerFactory schedulerFactory= newStdSchedulerFactory();

Scheduler scheduler=schedulerFactory.getScheduler();

JobDetail jobDetail=newJob(jobClass).withIdentity(jobName, jobGroupName).build();

CronTrigger simpleTrigger=newTrigger().withIdentity(triggerName, triggerGroupName)

.withSchedule(cronSchedule(cronExp)).startNow().build();

Date ft=scheduler.scheduleJob(jobDetail, simpleTrigger);

scheduler.start();

System.err.println("定时任务开始执行");

}catch(ObjectAlreadyExistsException e) {

e.printStackTrace();return "相同组内有重名的工作名称或者触发器名称";

}catch(SchedulerException e) {

e.printStackTrace();return "保存定时任务异常";

}return "success";

}public staticString removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,

JdbcTemplate jdbcTemplate) {try{

String jobSql= "select * from qrtz_triggers where JOB_NAME = ? and JOB_GROUP = ?";

List jobList=jdbcTemplate.queryForList(jobSql, jobName, jobGroupName);if (jobList.size() < 1) {return "数据库没有该任务";

}

SchedulerFactory schedulerFactory= newStdSchedulerFactory();

Scheduler scheduler=schedulerFactory.getScheduler();

TriggerKey triggerKey= newTriggerKey(triggerName, triggerGroupName);

scheduler.pauseTrigger(triggerKey);//停止触发器

scheduler.unscheduleJob(triggerKey);//移除触发器

JobKey jobKey = newJobKey(jobName, jobGroupName);

scheduler.deleteJob(jobKey);//删除任务

} catch(SchedulerException e) {

e.printStackTrace();return "fail";

}return "success";

}

}

测试可能会用到的URL

测试Quartz分布式集群,分别两个端口启动Tomcat,各访访问一次,看控制台,在看数据库表,慢慢研究,可定会有收获

新增任务URL

http://127.0.0.1:8080/addTask?jobName=UserVisitCountJob1&jobGroupName=UserVisitCountJobGroup1&triggerName=simpleTrigger1&triggerGroupName=triggerGroup1

删除任务URL

http://127.0.0.1:8080/removeTask?jobName=UserVisitCountJob1&jobGroupName=UserVisitCountJobGroup1&triggerName=simpleTrigger1&triggerGroupName=triggerGroup1

以上只是将一些关键步骤说明

关于quartz.properties配置详解如下

#Configure Main Scheduler Properties

#==============================================================#配置集群时,quartz调度器的id,由于配置集群时,只有一个调度器,必须保证每个服务器该值都相同,可以不用修改,只要每个ams都一样就行

org.quartz.scheduler.instanceName=Scheduler1

#集群中每台服务器自己的id,AUTO表示自动生成,无需修改

org.quartz.scheduler.instanceId=AUTO

#==============================================================#Configure ThreadPool

#==============================================================#quartz线程池的实现类,无需修改

org.quartz.threadPool.class =org.quartz.simpl.SimpleThreadPool

#quartz线程池中线程数,可根据任务数量和负责度来调整

org.quartz.threadPool.threadCount= 5#quartz线程优先级

org.quartz.threadPool.threadPriority= 5#==============================================================#Configure JobStore

#==============================================================#表示如果某个任务到达执行时间,而此时线程池中没有可用线程时,任务等待的最大时间,如果等待时间超过下面配置的值(毫秒),本次就不在执行,而等待下一次执行时间的到来,可根据任务量和负责程度来调整

org.quartz.jobStore.misfireThreshold= 60000#实现集群时,任务的存储实现方式,org.quartz.impl.jdbcjobstore.JobStoreTX表示数据库存储,无需修改

org.quartz.jobStore.class =org.quartz.impl.jdbcjobstore.JobStoreTX

#quartz存储任务相关数据的表的前缀,无需修改

org.quartz.jobStore.tablePrefix=QRTZ_

#连接数据库数据源名称,与下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以无需修改

org.quartz.jobStore.dataSource=myDS

#是否启用集群,启用,改为true,注意:启用集群后,必须配置下面的数据源,否则quartz调度器会初始化失败

org.quartz.jobStore.isClustered= false#集群中服务器相互检测间隔,每台服务器都会按照下面配置的时间间隔往服务器中更新自己的状态,如果某台服务器超过以下时间没有checkin,调度器就会认为该台服务器已经down掉,不会再分配任务给该台服务器

org.quartz.jobStore.clusterCheckinInterval= 20000#==============================================================#Non-Managed Configure Datasource

#==============================================================#配置连接数据库的实现类,可以参照IAM数据库配置文件中的配置

org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver

#配置连接数据库连接,可以参照IAM数据库配置文件中的配置

org.quartz.dataSource.myDS.URL= jdbc:mysql://localhost:3306/test

#配置连接数据库用户名

org.quartz.dataSource.myDS.user=yunxi

#配置连接数据库密码

org.quartz.dataSource.myDS.password= 123456#配置连接数据库连接池大小,一般为上面配置的线程池的2倍

org.quartz.dataSource.myDS.maxConnections= 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值