2、quartz程序实例

场景一:设置时间间隔执行定时任务


1、引入quartz必须的包



2、新建一个定时任务实例

继承Job方法,实现execute方法,方法里面就是你要执行的内容

       

package com.cn.demo1;


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

public class Task1 implements Job{

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		 System.out.println("第一个定时任务实例!");
	}

}

2、新建一个定时任务启动方法


package com.cn.demo1;

import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

public class StartTask1 {
	
	/**
	 * log4j:WARN No appenders could be found for logger (org.quartz.simpl.SimpleThreadPool).
	   log4j:WARN Please initialize the log4j system properly.
	          定时任务执行报如上错,因为缺少log4j.properties配置文件的缘故
	 */
	
	public static void main(String[] args) throws SchedulerException {
		start();
	}

	private static void start() throws SchedulerException {
		//通过SchedulerFactory来获取一个调度器
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        
        //引进作业程序
        JobDetail jobDetail = 
        new JobDetail("jobDetail-s1", "jobDetailGroup-s1", Task1.class);

        //new一个触发器
        SimpleTrigger simpleTrigger = 
        new SimpleTrigger("simpleTrigger", "triggerGroup-s1");

        //设置作业启动时间
        long ctime = System.currentTimeMillis(); 
        simpleTrigger.setStartTime(new Date(ctime));

        //设置作业执行间隔 
        simpleTrigger.setRepeatInterval(10000);

        //设置作业执行次数
        simpleTrigger.setRepeatCount(5);

        //设置作业执行优先级默认为5
        //simpleTrigger.setPriority(10);

        //作业和触发器设置到调度器中
        scheduler.scheduleJob(jobDetail, simpleTrigger);
        
        //启动调度器
        scheduler.start();
	}

}


3、启动,输出结果


   值得注意的是:启动的时候,作业执行次数是5,但是实际上,定时任务执行了6次。定时任务启动,会先执行一次,然后,重复5次。所以,最终会输出6次打印结果。

   另外,针对log4j:WARN No appenders could be found for logger (org.quartz.simpl.SimpleThreadPool).
               log4j:WARN Please initialize the log4j system properly.

   是因为缺少log4j.properties配置文件的缘故,大家根据需要加上即可,不影响程序运行。


   

   场景二:在某些特定的时间点执行。

   这个时候,我们就需要采用CronTrigger,通过配置cron表达式,定时执行。

   下面我们来看一个实例:


  1、新建一个定时任务实例

package com.cn.demo2;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;

public class Task2 implements Job{

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("第二个定时任务实例!");
		
	}

}

2、新建一个定时任务启动方法

package com.cn.demo2;

import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;


public class StartTask2 {
	
	public static void main(String[] args) throws SchedulerException, ParseException {
		start();
	}

	private static void start() throws SchedulerException, ParseException {  
	    Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();  
	    JobDetail jobDetail = new JobDetail("myJob", Scheduler.DEFAULT_GROUP,  
	    		Task2.class);  
	    CronTrigger trigger = new CronTrigger("crontrigger",Scheduler.DEFAULT_GROUP, "* * * * * ?");  
	    trigger.getJobDataMap().put("count", 0);
	    scheduler.scheduleJob(jobDetail, trigger);
	    scheduler.start(); 
	}

}

3、启动,输出结果

     


场景三:同一时刻相同的job只有一个在执行【有状态作业

     如果使用了Quartz,当然在一个系统中绝不仅仅是一个job那么简单,如果同一个job同一时刻运行,可能会造成重复入库的情况。

     所以我们希望多线程时,能够控制同一时刻相同job只能有一个正在执行。


    quartz提供了Job之外的接口:org.quartz.StatefulJob

   我们只需要将org.quartz.Job替换成org.quartz.StatefulJob接口。实现org.quartz.StatefulJob接口即可。


   当第二次job启动的时候第一个job还没执行完,第二个job会一直阻塞直到第一个job执行完毕。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值