Quartz定时器使用

触发器 Trigger: 什么时候工作
任务 Job: 做什么工作
调度器 Scheduler: 搭配 Trigger和Job

1.创建一个job类,用作要定时执行的方法:

package quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
 * MailJob 实现了 Job 接口,提供 execute,干具体的活儿
 * @author mzj07
 *
 */
@DisallowConcurrentExecution 
//默认的情况下,无论上一次任务是否结束或者完成,只要规定的时间到了,那么下一次就开始。
//有时候会做长时间的任务,比如数据库备份,这个时候就希望上一次备份成功结束之后,才开始下一次备份,即便是规定时间到了,也不能开始,因为这样很有可能造成 数据库被锁死 (几个线程同时备份数据库,引发无法预计的混乱)。
//那么在这种情况下,给数据库备份任务增加一个注解就好了: 
public class PhoneJob implements Job{

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		JobDetail jobDetail = context.getJobDetail();
		String phone = jobDetail.getJobDataMap().getString("phone");
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String now = sdf.format(new  Date());
        try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        System.out.printf("给手机号码 %s 打了一次通话, 当前时间是: %s%n" ,phone, now);
		
	}

}

2.创建测试类,用于启动这个定时任务:

package quartz;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;
import org.quartz.JobKey;

public class TestQuartz {

	public static void main(String[] args) throws Exception {
		jobDataMap();
//		databaseCurrentJob();
//		exceptionHandle1();
//		stop();
	}
private static void jobDataMap() throws SchedulerException, InterruptedException {
		//创建调度器
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        //定义一个触发器
        Trigger trigger = newTrigger().withIdentity("trigger1", "group1")//第一个参数为名称,第二个参数为所属的组
            .startNow()
            .withSchedule(simpleSchedule()
                .withIntervalInSeconds(2)//每隔2s执行一次
                .withRepeatCount(10))//总共执行10+1次(第一次)
            .build();
        Trigger trigger2 = newTrigger().withIdentity("trigger2", "group2")//第一个参数为名称,第二个参数为所属的组
                .startNow()
                .withSchedule(simpleSchedule()
                    .withIntervalInSeconds(2)//每隔2s执行一次
                    .withRepeatCount(10))//总共执行10+1次(第一次)
                .build();
  
        //定义一个JobDetail
        JobDetail job = newJob(MailJob.class)//指定是MailJob这个类干活,可自定义。
            .withIdentity("mailjob1", "mailgroup")//任务名称、分组
            .usingJobData("email", "admin@10086.com")//属性
            .build();
        JobDetail job_two  =newJob(PhoneJob.class)
        		.withIdentity("phonejob1","phonegroup")
        		.usingJobData("phone", "166****3936")
        		.build();
         
        //用JobDataMap 修改email
        job.getJobDataMap().put("email", "admin@taobao.com");
         

        //增加Job监听
        MailJobListener mailJobListener= new MailJobListener();
        KeyMatcher<JobKey> keyMatcher = KeyMatcher.keyEquals(job.getKey());
        scheduler.getListenerManager().addJobListener(mailJobListener, keyMatcher);
        //调度加入这个job
        scheduler.scheduleJob(job, trigger);
        scheduler.scheduleJob(job_two,trigger2);
  
        //启动
        scheduler.start();
          
        //等待20秒,让前面的任务都执行完了之后,再关闭调度器
        Thread.sleep(20000);
        scheduler.shutdown(true);
    }
	
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值