quartz学习2

上一篇简单的实现了定时作业的开始和结束,今天来用简单的Quartz的触发器来实现调度器全部的基本功能

1、首先创建一个需要定时执行的方法

package com.htwl.waste_api.Test;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

import java.util.Date;

/**
 * @author jiahailin
 * @Description:
 */
public class HelloJob implements Job {

    public HelloJob(){

    }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobKey jobKey = jobExecutionContext.getJobDetail().getKey();
        System.out.println("SimpleJob says: " + jobKey + " executing at " + new Date());
    }
}

2、开始操作

package com.htwl.waste_api.Test;

import jdk.nashorn.internal.scripts.JO;
import org.quartz.*;

import org.quartz.impl.StdSchedulerFactory;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.util.Date;

/**
 * @author jiahailin
 * @Description:
 */
public class FirstTest {

    public void run() throws SchedulerException {
        //第一步还是获取scheduler的引用
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();
        //jobs可以在sched.start()之前来安排
        //获取一个比现在时间大一点的整数时间(这里设置为15秒后)
        Date startTime = DateBuilder.nextGivenSecondDate(null,15);

        //job1只会在这个时间运行一次
        JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1","group1").build();
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startAt(startTime).build();
        //调度运行
        Date ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        //job2只会在这个时间运行一次
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job2","group1").build();
        trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger2","group1").startAt(startTime).build();
        ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        //job3会运行11次(运行一次,重复10次)
        //job3每10秒重复一次
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job3","group1").build();
        trigger = TriggerBuilder.newTrigger().withIdentity("trigger3","group1").startAt(startTime).
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
        ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        //相同的job(job3)会被另一个触发器(trigger)来调度(scheduler)
        //这次会重复两次,间隔10秒
        trigger = TriggerBuilder.newTrigger().withIdentity("trigger3","group2").startAt(startTime).
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build();
        ft = sched.scheduleJob(trigger);
        System.out.println(job.getKey() + " will [also] run at: " + ft + " and repeat: " + trigger.getRepeatCount()
                + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");

        //job4会运行6次(运行1次,重复5次)
        //job4每10秒重复一次
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job4","group1").build();
        trigger = TriggerBuilder.newTrigger().withIdentity("trigger4","group1").startAt(startTime).
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build();
        ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        //job5会在5分钟后运行一次
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job5","group1").build();
        trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("tirgger5","group1").
                startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE)).build();
        ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        //job6会每40秒运行一次,无限期的运行下去
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job6","group1").build();
        trigger = TriggerBuilder.newTrigger().withIdentity("trigger6","group1").
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
        ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        System.out.println("------- Starting Scheduler ----------------");
        //全部的job添加到了scheduler里,但是job在scheduler启动之前是不会执行的
        sched.start();
        System.out.println("------- Started Scheduler -----------------");

        //jobs也可以在sched.start()之后来安排
        //job7会每1分钟运行一次,重复1次
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job7","group1").build();
        trigger = TriggerBuilder.newTrigger().withIdentity("tirgger7","group1").startAt(startTime).
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).withRepeatCount(1)).build();
        ft = sched.scheduleJob(job,trigger);
        System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        //job可以立即启动,而不是等待trigger(调度器)
        job = JobBuilder.newJob(HelloJob.class).withIdentity("job8","group1").storeDurably().build();
        sched.addJob(job,true);
        System.out.println("'Manually' triggering job8...(手动调度job8)");
        sched.triggerJob(JobKey.jobKey("job8","group1"));

        //让他睡30秒,以便让程序执行完
        try {
            Thread.sleep(30L*1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //job也可以重新调度
        //job7会重新启动
        System.out.println("------- Rescheduling... --------------------");
        trigger = TriggerBuilder.newTrigger().withIdentity("tirgger7","group1").startAt(startTime).
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).withRepeatCount(20)).build();
        ft = sched.rescheduleJob(trigger.getKey(),trigger);
        System.out.println("job7 rescheduled to run at: " + ft);

        //让他睡5分钟,以便让程序执行完
        try {
            Thread.sleep(300L*1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("准备结束");
        sched.shutdown();
        System.out.println("已结束");

        //显示一些刚刚scheduler的统计信息
        SchedulerMetaData schedulerMetaData = sched.getMetaData();
        System.out.println("Executed " + schedulerMetaData.getNumberOfJobsExecuted() + " jobs.");
    }

    public static void main(String[] args) throws SchedulerException {
        FirstTest ft = new FirstTest();
        ft.run();
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值