Quartz的使用

Quartz使用总结:[url]http://www.cnblogs.com/drift-ice/p/3817269.html[/url]
quartz.properties配置:[url]http://orange5458.iteye.com/blog/1170777[/url]
quartz集群调度机制调研及源码分析:[url]http://www.cnblogs.com/davidwang456/p/4205237.html[/url]
深入解读Quartz的原理:[url]http://lavasoft.blog.51cto.com/62575/181907/[/url]
quartz源码解析:[url]http://www.cnblogs.com/davidwang456/p/3878625.html[/url]
任务调度开源框架Quartz动态添加、修改和删除定时任务 :[url]http://www.tuicool.com/articles/Ff6F7v[/url]
新建JOb
package job;

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.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleJob implements Job {
private static int jobCount = 0;
Logger log = LoggerFactory.getLogger(SimpleJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 此任务仅打印日志便于调试、观察
log.info("==================:"+this.getClass().getName() + " was just triggered...");
JobKey jobKey = context.getJobDetail().getKey();
TriggerKey triggerKey = context.getTrigger().getKey();
Scheduler scheduler = context.getScheduler();
//启动线程监听触发器的状态
new Thread(new SchedEventLister(triggerKey,scheduler)).start();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
log.info("任务分组名称: " + jobKey.getGroup()+",任务名称: " +
jobKey.getName()+",触发器组名称: " + triggerKey.getGroup()+ ",触发器名称: "+
triggerKey.getName()+" 执行时间: " + sdf.format(new Date()) + ",计数: " + (++jobCount)) ;

//如果任务执行超过15次就结束它
/* if(jobCount > 3){
log.warn("结束任务...");
try {
//Delete the identified Job from the Scheduler - and any associated Triggers.
//从调度器中删除这个唯一任务时同时会删除相关联的触发器^_^
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}*/
if(jobCount == 2 ){
//暂停触发器
try {
scheduler.pauseTrigger(triggerKey);
log.warn("已经暂停了触发器...,触发器组名: " + triggerKey.getGroup() + ",触发器名称: " + triggerKey.getName());
} catch (SchedulerException e) {
throw new RuntimeException(e);
}

}
if(jobCount == 4){
try {
scheduler.pauseTrigger(triggerKey); // 停止触发器
scheduler.unscheduleJob(triggerKey);//移除触发器
scheduler.pauseJob(jobKey);// 停止任务
scheduler.deleteJob(jobKey);// 删除任务
log.error("正在停止并且移除触发器...,触发器组名: " + triggerKey.getGroup() + ",触发器名称: " + triggerKey.getName());
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}

}

}


Job监听器:
package job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SchedEventLister implements Runnable{
private static Logger log = LoggerFactory.getLogger(SchedEventLister.class);
private Scheduler sched = null;
private TriggerKey triggerKey = null;

public SchedEventLister(TriggerKey triggerKey,Scheduler sched) {
log.info("触发器线程监听启动....");
this.triggerKey = triggerKey;
this.sched = sched;
}

@Override
public void run() {

log.info("触发器线程监听中。。。。"
+ new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
.format(new Date()));

// 获取当前触发器的状态
Trigger.TriggerState ts = null;
try {
ts = sched.getTriggerState(triggerKey);
} catch (SchedulerException e) {
e.printStackTrace();
}

// 如果为暂停状态就恢复
if (ts == Trigger.TriggerState.PAUSED) {

// 暂停10秒在恢复
try {
log.warn("暂停当前线程5秒钟后在恢复触发器...,触发器组名: " + triggerKey.getGroup()
+ ",触发器名称: " + triggerKey.getName());
Thread.sleep(5L * 1000L);
} catch (InterruptedException e1) {
e1.printStackTrace();
}

// 恢复触发器
log.warn("正在恢复了触发器...,触发器组名: " + triggerKey.getGroup()
+ ",触发器名称: " + triggerKey.getName());
try {
sched.resumeTrigger(triggerKey);
} catch (SchedulerException e) {
throw new RuntimeException(e);
}

} else if (ts == Trigger.TriggerState.NORMAL) {
log.info("触发器线程监听中。。。。,状态:正常 ");
} else if (ts == Trigger.TriggerState.NONE) {
log.info("触发器线程监听中。。。。,状态:没有触发器 ");
} else if (ts == Trigger.TriggerState.ERROR) {
log.info("触发器线程监听中。。。。,状态:错误 ");
} else if (ts == Trigger.TriggerState.BLOCKED) {
log.info("触发器线程监听中。。。。,状态:堵塞 ");
}
}
}


简单触发器测试:
package job;

import java.util.concurrent.TimeUnit;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class testSimpleTrriger {
private static Logger logger = LoggerFactory.getLogger(testSimpleTrriger.class);

public static void main(String[] args) {

try {
// 获取Scheduler实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 具体任务
JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("SimpleJob", "Job-Group-Simple").build();
// 触发时间点
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger", "Trriger-Group-Simple").
startNow().withSchedule(simpleScheduleBuilder).build();
// 交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
scheduler.start();
try {
TimeUnit.MINUTES.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭Scheduler
scheduler.shutdown();
} catch (SchedulerException se) {
logger.error(se.getMessage(), se);
}
}

}


CronTrigger触发器测试:
package job;

import java.util.concurrent.TimeUnit;

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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestCronTrriger {
private static Logger logger = LoggerFactory.getLogger(testSimpleTrriger.class);

public static void main(String[] args) {

try {
// 获取Scheduler实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler cronScheduler = schedulerFactory.getScheduler();
// 具体任务
JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("SimpleJob", "Job-Group-Simple").build();
// 触发时间点
// 交由Scheduler安排触发
String cronExpression = "0/5 * * * * ?"; // 每分钟的30s起,每5s触发任务
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger", "Trriger-Group-Simple")
.withSchedule(cronScheduleBuilder)
.build();
cronScheduler.scheduleJob(job, cronTrigger);
cronScheduler.start();
try {
/* 为观察程序运行,此设置主程序睡眠2分钟才继续往下运行(因下一个步骤是“关闭Scheduler”) */
TimeUnit.MINUTES.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭Scheduler
cronScheduler.shutdown();
} catch (SchedulerException se) {
logger.error(se.getMessage(), se);
}
}
}


上面两个测试类只是测试触发器种类不同而已,使劲处理的job是相同的
测试结果:
九月 05, 2016 9:41:00 上午 org.quartz.impl.StdSchedulerFactory instantiate
信息: Using default implementation for ThreadExecutor
九月 05, 2016 9:41:00 上午 org.quartz.simpl.[color=red]SimpleThreadPool[/color] initialize
信息: Job execution threads will use class loader of thread: main
九月 05, 2016 9:41:00 上午 org.quartz.core.SchedulerSignalerImpl <init>
信息: Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
九月 05, 2016 9:41:00 上午 org.quartz.core.QuartzScheduler <init>
信息: Quartz Scheduler v.2.2.1 created.
九月 05, 2016 9:41:00 上午 [color=red]org.quartz.simpl.RAMJobStore[/color] initialize
信息: RAMJobStore initialized.
九月 05, 2016 9:41:00 上午 org.quartz.core.QuartzScheduler initialize
信息: Scheduler meta-data: Quartz Scheduler (v2.2.1) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

九月 05, 2016 9:41:00 上午 org.quartz.impl.StdSchedulerFactory instantiate
信息: Quartz scheduler 'DefaultQuartzScheduler' [color=red]initialized from default resource file in Quartz package: 'quartz.properties'[/color]
###如果配置了quartz.properties则从quartz.properties文中加载相关配置信息
九月 05, 2016 9:41:00 上午 org.quartz.impl.StdSchedulerFactory instantiate
信息: Quartz scheduler version: 2.2.1
九月 05, 2016 9:41:00 上午 org.quartz.core.QuartzScheduler start
信息: Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[color=green]#第一次执行[/color]
九月 05, 2016 9:41:00 上午 job.SimpleJob execute
信息: ==================:job.SimpleJob was just triggered...
九月 05, 2016 9:41:00 上午 job.SchedEventLister <init>
信息: 触发器线程监听启动....
九月 05, 2016 9:41:00 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。2016-09-05 09:41:00
九月 05, 2016 9:41:00 上午 job.SimpleJob execute
信息: 任务分组名称: Job-Group-Simple,任务名称: SimpleJob,触发器组名称: Trriger-Group-Simple,触发器名称: SimpleTrigger 执行时间: 2016-09-05 09:41:00,计数: 1
九月 05, 2016 9:41:00 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。,状态:正常
[color=green]#第二次执行, 暂停5秒钟,再恢复[/color]
九月 05, 2016 9:41:05 上午 job.SimpleJob execute
信息: ==================:job.SimpleJob was just triggered...
九月 05, 2016 9:41:05 上午 job.SchedEventLister <init>
信息: 触发器线程监听启动....
九月 05, 2016 9:41:05 上午 job.SimpleJob execute
信息: 任务分组名称: Job-Group-Simple,任务名称: SimpleJob,触发器组名称: Trriger-Group-Simple,触发器名称: SimpleTrigger 执行时间: 2016-09-05 09:41:05,计数: 2
九月 05, 2016 9:41:05 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。2016-09-05 09:41:05
九月 05, 2016 9:41:05 上午 job.SimpleJob execute
警告: 已经暂停了触发器...,触发器组名: Trriger-Group-Simple,触发器名称: SimpleTrigger
九月 05, 2016 9:41:05 上午 job.SchedEventLister run
警告: 暂停当前线程5秒钟后在恢复触发器...,触发器组名: Trriger-Group-Simple,触发器名称: SimpleTrigger
九月 05, 2016 9:41:10 上午 job.SchedEventLister run
警告: 正在恢复了触发器...,触发器组名: Trriger-Group-Simple,触发器名称: SimpleTrigger
[color=green]#第三次执行[/color]
九月 05, 2016 9:41:10 上午 job.SimpleJob execute
信息: ==================:job.SimpleJob was just triggered...
九月 05, 2016 9:41:10 上午 job.SchedEventLister <init>
信息: 触发器线程监听启动....
九月 05, 2016 9:41:10 上午 job.SimpleJob execute
信息: 任务分组名称: Job-Group-Simple,任务名称: SimpleJob,触发器组名称: Trriger-Group-Simple,触发器名称: SimpleTrigger 执行时间: 2016-09-05 09:41:10,计数: 3
九月 05, 2016 9:41:10 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。2016-09-05 09:41:10
九月 05, 2016 9:41:10 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。,状态:正常
[color=green]#第四次执行[/color]
九月 05, 2016 9:41:15 上午 job.SimpleJob execute
信息: ==================:job.SimpleJob was just triggered...
九月 05, 2016 9:41:15 上午 job.SchedEventLister <init>
信息: 触发器线程监听启动....
九月 05, 2016 9:41:15 上午 job.SimpleJob execute
信息: 任务分组名称: Job-Group-Simple,任务名称: SimpleJob,触发器组名称: Trriger-Group-Simple,触发器名称: SimpleTrigger 执行时间: 2016-09-05 09:41:15,计数: 4
九月 05, 2016 9:41:15 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。2016-09-05 09:41:15
九月 05, 2016 9:41:15 上午 job.SimpleJob execute
严重: 正在停止并且移除触发器...,触发器组名: Trriger-Group-Simple,触发器名称: SimpleTrigger
九月 05, 2016 9:41:15 上午 job.SchedEventLister run
信息: 触发器线程监听中。。。。,状态:没有触发器
九月 05, 2016 9:43:00 上午 org.quartz.core.QuartzScheduler shutdown
信息: Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
九月 05, 2016 9:43:00 上午 org.quartz.core.QuartzScheduler standby
信息: Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
九月 05, 2016 9:43:00 上午 org.quartz.core.QuartzScheduler shutdown
信息: Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.


quartz.properties文件:
#线程池实现类
org.quartz.threadPool.class =org.quartz.simpl.SimpleThreadPool
#线程池数
org.quartz.threadPool.threadCount = 5
#线程池优先级
org.quartz.threadPool.threadPriority = 5
#线程池运行模式守后,还是前台
org.quartz.threadPool.makeThreadsDaemons=false
###线程池配置的继承属性
org.quartz.threadPool.threadsInheritGroupOfInitializingThread=true
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
###保存job调度执行信息到RAM,这种方式当应用下次重启时,job调度信息容易丢失
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.misfireThreshold = 60000
############.JobStoreTX,是将job调度信息保存到RDB中,应用重启时可以重新调度job
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.dataSource=test
#org.quartz.dataSource.test.driver=com.mysql.jdbc.Driver
#org.quartz.dataSource.test.URL=jdbc\:mysql\://localhost\:3306/test?useUnicode\=true&characterEncoding\=utf8&characterSetResults\=utf8
#org.quartz.dataSource.test.user=root
#org.quartz.dataSource.test.password=123456
#org.quartz.dataSource.test.maxConnections=20
<think>好的,我现在需要帮助用户了解Quartz使用方法或教程。首先,我得回忆一下Quartz的基本概念和主要功能。Quartz是一个开源的作业调度框架,用于在Java应用中执行定时任务。用户可能想了解如何配置、创建任务以及启动调度器。 根据用户提供的引用内容,引用[1]提到Quartz应用有时被称为服务器节点,这可能涉及集群配置。引用[2]指出任务类需要一个公共的空构造函数,这可能是在实现Job接口时需要注意的点。引用[3]提到任务需要实现org.quartz.Job接口,并实现execute()方法。这些都是关键点,需要在回答中涵盖。 接下来,我需要按照用户的系统级指令来组织回答。用户要求使用中文,正确使用LaTeX格式的行内和独立公式,生成相关问题,并在引用处添加标识。不过,在Quartz的教程中可能不太涉及数学公式,所以可能需要确认是否有必要添加。不过根据示例,用户可能接受在必要时使用,比如在配置参数或表达式时,如果有的话。例如,定时表达式可能需要说明,但Quartz通常使用cron表达式,可能不需要LaTeX数学公式,因此可能不需要特别处理这部分,但需要确保其他格式要求。 回答结构需要清晰,分步骤说明。可能需要包括配置Quartz、创建任务、配置调度器和触发器等步骤。同时,要引用提供的引用内容,确保在适当的地方添加引用标识。例如,在提到任务类需要空构造函数时,引用[2],在解释任务Job时引用[3]。 然后,需要生成相关问题。根据用户之前的示例,问题可能围绕配置、优化、应用场景等。例如,如何配置集群,如何处理任务异常,Quartz的持久化配置等。 需要检查是否遗漏了重要步骤,比如依赖配置(如添加Quartz库到项目中),或者调度器的启动和关闭。此外,是否需要提到JobDataMap传递参数,触发器的类型(如SimpleTrigger和CronTrigger)等,都是Quartz教程中的常见内容。 最后,确保回答符合用户的要求:结构清晰,分步骤,引用正确,问题相关。需要避免使用Markdown格式,但用户提供的示例中使用了代码块,所以可能需要保留代码示例,但根据用户当前的指令,用户可见层可能允许代码块。需要确认用户是否允许代码块,但根据问题中的示例,用户似乎接受代码块,所以可以包含。 总结步骤: 1. 引入Quartz的基本概念和作用。 2. 分步骤说明使用流程:配置调度器、定义任务、创建触发器、启动调度器。 3. 每个步骤中包含代码示例,并引用相关引用内容。 4. 生成相关问题,如配置、集群、持久化、异常处理等。 5. 确保引用标识正确放置,如任务类需要空构造函数引用[2],Job接口引用[3],集群节点引用[1]。</think>### Quartz 使用教程 Quartz 是一个开源的作业调度框架,用于在 Java 应用中管理定时任务。以下是其核心使用步骤: --- #### 1. **配置调度器** Quartz 的核心是 `Scheduler`,需通过工厂类创建并配置参数: ```java // 创建调度器工厂 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 获取调度器实例 Scheduler scheduler = schedulerFactory.getScheduler(); ``` 若需集群配置,可在 `quartz.properties` 中定义节点属性[^1]。 --- #### 2. **定义任务类** 任务需实现 `org.quartz.Job` 接口,并满足以下条件: - 实现 `execute()` 方法,编写具体任务逻辑。 - 提供**公共空构造函数**(Quartz 反射实例化任务类时需要)[^2]。 ```java public class MyJob implements Job { public MyJob() {} // 必须的空构造函数 @Override public void execute(JobExecutionContext context) { System.out.println("任务执行中..."); } } ``` --- #### 3. **创建触发器** 触发器定义任务执行规则。例如,使用 `SimpleTrigger` 实现间隔触发: ```java // 每隔5秒执行一次,重复3次 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) .withRepeatCount(3)) .build(); ``` --- #### 4. **绑定任务与触发器并启动** 将任务和触发器注册到调度器中: ```java // 定义任务详情,关联 MyJob 类 JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("job1") .build(); // 绑定任务和触发器 scheduler.scheduleJob(job, trigger); // 启动调度器 scheduler.start(); ``` --- ### 关键配置项 - **持久化**:通过 `JobStore` 配置将任务状态保存到数据库。 - **线程池**:在 `quartz.properties` 中调整线程数量以优化性能。 - **集群模式**:配置数据库持久化后,多个节点可自动协调任务[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值