步骤 2 : 先运行,看到效果,再学习 步骤 3 : 模仿和排错 步骤 4 : TestQuartz 步骤 5 : quartz.properties
这所谓的Quartz集群,是指在 基于数据库存储 Quartz调度信息 的基础上, 有多个一模一样的 Quartz 应用在运行。
当某一个Quartz 应用重启或者发生问题的时候, 其他的Quartz 应用会 借助 数据库这个桥梁探知到它不行了,从而接手把该进行的Job调度工作进行下去。 以这种方式保证任务调度的高可用性,即在发生异常重启等情况下,调度信息依然连贯性地进行下去,就好像 Quartz 应用从来没有中断过似的。 注: 文中描述的 Quartz 应用 在一些语境下,又叫做 Quartz 服务器节点,都是同一个概念。
老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
运行有较多步骤,请严格按部就班地来: 1. 启动一次 TestQuartz,叫做 a 应用 2. 紧接着(在几秒钟内)再次启动 TestQuartz,叫做 b 应用 这样就启动了两个Quartz应用了 3. 使用多控制台显示方式,在两个不同的控制台观察现象 将会观察到如下现象: a 应用 只会运行20秒,就自动结束了。 这20秒,仅仅够运行两次任务的,所以观察到两次输出。 b 应用在 a 应用结束之前,是不会运行的 b 应用在 a 应用结束之后 ,自动接过了革命的火炬,不停地接着把后续的任务都运行完毕
在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。 采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。 推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。 这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来 这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
TestQuartz 不需要做改动,沿用 JDBC Store 里的 TestQuartz.java 就行
package com.how2java;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.ObjectAlreadyExistsException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class TestQuartz {
public static void main(String[] args) throws Exception {
try {
assginNewJob();
} catch (ObjectAlreadyExistsException e) {
System.err.println("发现任务已经在数据库存在了,直接从数据库里运行:"+ e.getMessage());
// TODO Auto-generated catch block
resumeJobFromDatabase();
}
}
private static void resumeJobFromDatabase() throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
System.out.println("当前调度器的id是:"+scheduler.getSchedulerInstanceId());
scheduler.start();
// 等待200秒,让前面的任务都执行完了之后,再关闭调度器
Thread.sleep(200000);
scheduler.shutdown(true);
}
private static void assginNewJob() throws SchedulerException, InterruptedException {
// 创建调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 定义一个触发器
Trigger trigger = newTrigger().withIdentity("trigger1", "group1") // 定义名称和所属的租
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(15) // 每隔15秒执行一次
.withRepeatCount(10)) // 总共执行11次(第一次执行不基数)
.build();
// 定义一个JobDetail
JobDetail job = newJob(MailJob.class) // 指定干活的类MailJob
.withIdentity("mailjob1", "mailgroup") // 定义任务名称和分组
.usingJobData("email", "admin@10086.com") // 定义属性
.build();
// 调度加入这个job
scheduler.scheduleJob(job, trigger);
System.out.println("当前调度器的id是:"+scheduler.getSchedulerInstanceId());
// 启动
scheduler.start();
// 等待20秒,让前面的任务都执行完了之后,再关闭调度器
Thread.sleep(20000);
scheduler.shutdown(true);
}
}
quartz.properties 在原来的基础上,增加4行:
开启集群 org.quartz.jobStore.isClustered = true 要进行集群,多个应用调度名称 instanceName 应该是一样的 org.quartz.scheduler.instanceName = quartzScheduler 要进行集群,多个应用调度id instanceId 必须不一样,这里使用AUTO,就会自动分配不同的ID。 目测是本机机器名称加上时间戳 org.quartz.scheduler.instanceId = AUTO 每个一秒钟去数据库检查一下,以在其他应用挂掉之后及时补上 org.quartz.jobStore.clusterCheckinInterval = 1000 org.quartz.jobStore.isClustered = true
org.quartz.scheduler.instanceName = quartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.jobStore.clusterCheckinInterval = 1000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = mysqlDatabase
org.quartz.dataSource.mysqlDatabase.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.mysqlDatabase.URL = jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8
org.quartz.dataSource.mysqlDatabase.user = root
org.quartz.dataSource.mysqlDatabase.password = admin
org.quartz.dataSource.mysqlDatabase.maxConnections = 5
org.quartz.jobStore.isClustered = true org.quartz.scheduler.instanceName = quartzScheduler org.quartz.scheduler.instanceId = AUTO org.quartz.jobStore.clusterCheckinInterval = 1000 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.scheduler.instanceName = MyScheduler org.quartz.threadPool.threadCount = 3 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.dataSource = mysqlDatabase org.quartz.dataSource.mysqlDatabase.driver = com.mysql.jdbc.Driver org.quartz.dataSource.mysqlDatabase.URL = jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8 org.quartz.dataSource.mysqlDatabase.user = root org.quartz.dataSource.mysqlDatabase.password = admin org.quartz.dataSource.mysqlDatabase.maxConnections = 5
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2019-10-07
quartz这个教程有点懵逼 ,希望来个完整的实战
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|