Quartz读完我的这篇,你就会用了

本文介绍了QuartzRAM的使用,包括启动、暂停、停止操作,执行一次的定时任务,自定义执行次数,Job参数传递,Job线程并发问题及解决,以及重启恢复策略和misfire策略的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QuartzRAM

Quartz是一个完全由java编写的开源作业调度框架,这里只写基于RAM的,相信你看完本篇,你就学会应用Quartz了,至于持久化应用,我会写在另一篇里,如果对笔者文章或者其他地方有见解或者疑问请下方评论或者至liruli@aliyun.com

1.QuartzRAMDemo

状态控制:

​ 启动:start();

​ 暂停:standby();

​ 停止:shutdown();

注意: 使用shutdown()方法后必须重新实例化,否则无法启动;只有当scheduler启动后,即使

​ 处于暂停状态也不行,trigger才会被触发(job才会被执行)。

JobDemo
public class JobDemo implements Job {

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = format.format(new Date());
        System.out.println(time + " helloword!!");
    }
}
执行一次的定时任务
public static void testJob() throws SchedulerException{
        //quartz工厂类
        SchedulerFactory factory = new StdSchedulerFactory();
        
        //get调度器
        Scheduler scheduler = factory.getScheduler();
        scheduler.start(); 
        //scheduler.standby();
        JobDetail job = newJob(JobDemo.class).build();//定时执行的工作
        //得到jobKey
        JobKey jobKey = job.getKey();
        
        int limit_time = 5;
        
        //定时设置
        SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                .startAt(futureDate(limit_time, IntervalUnit.SECOND))//秒
                .withSchedule(SimpleScheduleBuilder.simpleSchedule())
                .forJob(jobKey) 
                .build();
        scheduler.scheduleJob(job, trigger);
        //停止
        //scheduler.shutdown();
    }
自定义执行次数
public static void test1Job() throws SchedulerException {
        
        SchedulerFactory factory = new StdSchedulerFactory();

        Scheduler scheduler = factory.getScheduler();

        JobDetail job = newJob(JobDemo.class)
            .withIdentity("myJob", "group1")//定义的job 名称 组名
            .build();

        //任务运行的时间,SimpleSchedle类型触发器有效
       /* long time=  System.currentTimeMillis() + 3*1000L; //3秒后启动任务
        Date statTime = new Date(time);*/
       
        //创建触发器
        SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
        simpleScheduleBuilder.withIntervalInSeconds(10);//以秒为单位
        simpleScheduleBuilder.withRepeatCount(5);//执行次数

        
        Trigger trigger = TriggerBuilder.newTrigger()
                //.withDescription("")描述
                //.withIdentity("ramTrigger", "ramTriggerGroup") 触发器的名称  触发器的组
                //.startAt(statTime)  //默认当前时间启动
                //.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次  corn自定义表达式http://cron.qqe2.com/
                .withSchedule(simpleScheduleBuilder) // 这里用触发器 
                .build();


        // 任务放入调度器
        scheduler.scheduleJob(job, trigger);
        
        scheduler.start();
    }

2.Quartz传参问题

JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型的数据的方法;在job实例执行的时候,可以使用其中的数据;

getJobDataMap

首先得到JobDataMap,然后存键值对:

//得到job
JobDetail job = newJob(JobDemo.class).build();

//得到JobDataMap
JobDataMap jobDataMap = job.getJobDataMap();
jobDataMap.put("name", "张三");
jobDataMap.put("age", "18");
jobDataMap.put("sex", "男");
job接收
public class JobDemo implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //得到jobDataMap
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String name = (String) jobDataMap.get("name");
        String age = (String) jobDataMap.get("age");
        String sex = (String) jobDataMap.get("sex");
        
        //想干点啥就干点啥
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = format.format(new Date());
        System.out.println(time + " helloword!!" + "\n姓名:" + name + "\n年龄:" + age + "\n性别:" + sex);
    }

3.Job线程并发问题

quartz默认是多线程的,如果执行任务的对象不是单例的,则每个线程都会产生任务对象,这些任务对象的同时执行可能会导致并发问题

@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail

4.重启恢复策略

quartz,java世界里面的任务管理容器。

至于为什么会有misfire这个概念,我想可以重这三个方面来进行说明:

1 所有的线程都在忙于更高优先级的任务

2 任务本身CRASH了

3 代码的BUG,导置错误的设置了JOB

基于这3种原因,其实也是现实世界中的常理。没有任何事情,都能保证100%运行OK。quartz提出了misfire的理论,让任务在错过之后,还能正常的运行。

misfire策略:

1551237767864

使用方法:

public static void testJob() throws SchedulerException{
        //quartz工厂类
        SchedulerFactory factory = new StdSchedulerFactory();
        
        //get调度器
        Scheduler scheduler = factory.getScheduler();
        scheduler.start(); 
        //scheduler.standby();
        JobDetail job = newJob(JobDemo.class).build();//定时执行的工作
        //得到jobKey
        JobKey jobKey = job.getKey();
        
        int limit_time = 5;
        
        //定时设置
        SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                .startAt(futureDate(limit_time, IntervalUnit.SECOND))//秒
          		.withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withMisfireHandlingInstructionIgnoreMisfires())//线程重启恢复策略
                .forJob(jobKey) 
                .build();
        scheduler.scheduleJob(job, trigger);
        //停止
        //scheduler.shutdown();
    }
	//在触发器中定义也可
        SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
        simpleScheduleBuilder.withIntervalInSeconds(10);//以秒为单位
        simpleScheduleBuilder.withRepeatCount(5);//执行次数
        simpleScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值