quartz - demo
2018-08-19 本文已影响17人
东方舵手
1. 引入依赖
<dependencies>
<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>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
2. 配置文件
log4j.properties
log4j.rootLogger=ERROR,Al
log4j.appender.Al=org.apache.log4j.ConsoleAppender
log4j.appender.Al.layout=org.apache.log4j.PatternLayout
log4j.appender.Al.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
quatrz.properties
#实例
org.quartz.scheduler.instanceName=MyScheduler
#线程池中线程数量
org.quartz.threadPool.threadCount=3
#存储方式:内存存储
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
3. 创建类实现Job
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PickNewsJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println("在"+sdf.format(new Date()) + "爬取新闻: " + Thread.currentThread().getName());
}
}
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GetHottestJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println("在" + sdf.format(new Date()) + "根据文章的阅读量和评论量生成最热文章列表: "+ Thread.currentThread().getName());
}
}
4. 创建监听类
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
public class NewsJobListener implements JobListener {
/**
* 为监听器命名
* @return
*/
public String getName() {
return "myJobListener";
}
public void jobToBeExecuted(JobExecutionContext context) {
System.out.println(getName() + "触发对" + context.getJobDetail().getJobClass()
+ "开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作");
}
//否决执行时被调度
public void jobExecutionVetoed(JobExecutionContext context) {
System.out.println("否决执行,可以做些日志");
}
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
System.out.println(getName() + "触发对" + context.getJobDetail().getJobClass()
+ "结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作");
}
}
5. 创建朱类 调用
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.matchers.KeyMatcher;
import java.util.Date;
import java.util.List;
import java.util.Set;
public class NewsTrigger {
public static void main(String[] args) throws SchedulerException {
//创建job
JobDetail pickNewsJob = JobBuilder.newJob(PickNewsJob.class).withIdentity("我的第一个任务", "1组").build();
JobDetail getHottestJob = JobBuilder.newJob(GetHottestJob.class).withIdentity("我的第二个任务", "2组").build();
//创建触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("我的第一个触发器", "1组")
//每5秒执行1次 一共执行10次
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 5)).startNow()
.build();
//创建触发器
Trigger trigger2 = TriggerBuilder.newTrigger()
.withIdentity("我的第二个触发器", "1组")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 2)).startNow()
.build();
//创建调度器
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
//注册监听器
NewsJobListener jobListener = new NewsJobListener();
KeyMatcher<JobKey> pickNewsJobKeyMatcher = KeyMatcher.keyEquals(pickNewsJob.getKey());
KeyMatcher<JobKey> getHottestJobKeyMatcher = KeyMatcher.keyEquals(getHottestJob.getKey());
scheduler.getListenerManager().addJobListener(jobListener, pickNewsJobKeyMatcher);
scheduler.getListenerManager().addJobListener(jobListener, getHottestJobKeyMatcher);
//执行任务
scheduler.scheduleJob(pickNewsJob, trigger);
scheduler.scheduleJob(getHottestJob, trigger2);
scheduler.start();
printJobList(scheduler);
}
public static void printJobList(Scheduler scheduler) throws SchedulerException {
List<String> jobGroupNames = scheduler.getJobGroupNames();
for (String jobGroupName : jobGroupNames) {
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(jobGroupName));
for (JobKey jobKey : jobKeys) {
String name = jobKey.getName();
String group = jobKey.getGroup();
List<Trigger> triggersOfJob = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
Date nextFireTime = triggersOfJob.get(0).getNextFireTime();
System.out.println("[组]" + group + ",[任务]" + name + ",[下次执行时间]" + nextFireTime);
}
}
}
}
运行结果
[组]2组,[任务]我的第二个任务,[下次执行时间]Sun Aug 19 11:02:35 CST 2018
[组]1组,[任务]我的第一个任务,[下次执行时间]Sun Aug 19 11:02:40 CST 2018
在11:02:35爬取新闻: DefaultQuartzScheduler_Worker-1
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:35根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-2
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:37根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-3
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:39根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-4
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
在11:02:40爬取新闻: DefaultQuartzScheduler_Worker-5
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:41根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-6
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:43根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-7
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
在11:02:45爬取新闻: DefaultQuartzScheduler_Worker-8
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:45根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-9
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:47根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-10
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:49根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-1
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
在11:02:50爬取新闻: DefaultQuartzScheduler_Worker-2
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:51根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-3
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob开始执行的监听工作,这个位置可以做资源准备,日志记录等个工作
在11:02:53根据文章的阅读量和评论量生成最热文章列表: DefaultQuartzScheduler_Worker-4
myJobListener触发对class com.qfedu.quatrzdemo.GetHottestJob结束执行的监听工作,这个位置可以做记录结果统计工作,资源销毁工作
在11:02:55爬取新闻: DefaultQuartzScheduler_Worker-5
在11:03:00爬取新闻: DefaultQuartzScheduler_Worker-6
在11:03:05爬取新闻: DefaultQuartzScheduler_Worker-7