java基础

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
上一篇下一篇

猜你喜欢

热点阅读