quartz - demo

作者: 东方舵手 | 来源:发表于2018-08-19 11:03 被阅读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
    

    相关文章

      网友评论

        本文标题:quartz - demo

        本文链接:https://www.haomeiwen.com/subject/fbcciftx.html