Quartz定时器使用

参考链接:
https://www.cnblogs.com/vmask/p/8728691.html
https://www.cnblogs.com/qlqwjy/p/8721963.html

添加Maven依赖

<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>2.3.2</version>
</dependency>

<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz-jobs</artifactId>
   <version>2.3.2</version>
</dependency>

版本可以到Maven仓库中使用最新版本的,根据自己心情决定。

创建一个类,实现Job接口,Job接口里面只有一个方法execute(JobExecutionContext xontext)

// 此注解目的为:一定是已经执行完一个任务才按照时间去开启下一个任务
@DisallowConcurrentExecution
public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        //打印当前的时间
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        System.err.println("START:current exec time is :"+sf.format(date));
        try {
            // 睡眠10秒,测试任务执行时间超过同步周期的情况
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Date date2 = new Date();
        System.err.println("-------END:current exec time is :"+sf.format(date2));
    }
}

实例化一个JobDetail对象

JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("name", "group").build();

有关参数的详细介绍,请自己查找API或者参考上述的参考链接

实例化一个CronTrigger对象,此对象支持Cron表达式

CronTrigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("trigger", "group1")
        .forJob(jobDetail)
        .startNow()
        .withSchedule(
                CronScheduleBuilder.cronSchedule("*/7 * * * * ?") // 这里是cron表达式,意思是:每隔7秒执行一次。
        ).build();

同理,有关参数的详细介绍,请自己查找API或者参考上述的参考链接

实例化StdSchedulerFactory对象,通过StdSchedulerFactory对象获取一个Scheduler

StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = stdSchedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
  • 完整代码为:
public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {

        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("name", "group").build();

        // 打印当前的时间
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        System.out.println("current time is :" + sf.format(date));

        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger", "group1")
                .forJob(jobDetail)
                .startNow()
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("*/7 * * * * ?")
                ).build();


        StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = stdSchedulerFactory.getScheduler();

        scheduler.scheduleJob(jobDetail, trigger);

        scheduler.start();
    }
}

这样,启动之后,就会每隔7秒钟执行一次。不过,由于中间睡眠了10秒钟,所以看到的现象是:每隔10秒钟执行一次,而且不会出现并发执行的效果。


@DisallowConcurrentExecution: 此注解的作用是,对于同一个定时任务,只有当上一次执行结束后,才执行下一次。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值