Quartz定时任务
- 开发的过程中,有些场景会用到定时器,遇到了分享出来给大家。
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来>执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:
- 持久性作业 - 就是保持调度定时的状态
- 作业管理 - 对调度作业进行有效的管理;
基本的组成部分:
- 调度器:Scheduler
- 任务:JobDetail
- 触发器:Trigger,包括SimpleTrigger和CronTrigger
关于Quartz具体的详情信息,可自行详情度娘。
直接上代码
- 1:创建定时任务(Demo)===>里面书写你要写的定时执行的代码
- 2:需要实现Job里面的方法
package org.java.admin.manage.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @program: lb-manage
* @description 定时任务
* @author: LiuBao
* @create: 2020-07-30 10:03
**/
public class ChargeTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("定时器被执行了");
}
}
- 1:封装一个定时工具类
- 2:代码详情如下
package org.java.admin.manage.quartz;
import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
import java.util.Map;
/**
* @program: lb-manage
* @description
* @author: LiuBao
* @create: 2020-07-30 10:06
**/
public class ChargeTriggerUtil {
/**
* 创建定时任务
* @param job
* @param map
* @param key
* @param date
*/
public static void createTask(Job job, Map<String, Object> map, String key, Date date) throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
//创建唯一标识
JobKey jobKey = new JobKey(key);
//数据传输
JobDataMap jobDataMap = new JobDataMap(map);
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(jobKey).setJobData(jobDataMap).build();
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(key).startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();
scheduler.scheduleJob(jobDetail, trigger);
}
/**
* 删除定时任务
* @param key
*/
public static void deleteTask(String key) {
Scheduler scheduler = null;
try {
scheduler = new StdSchedulerFactory().getScheduler();
scheduler.deleteJob(new JobKey(key));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
- 测试 如下
package org.java.admin.manage.quartz;
import org.quartz.SchedulerException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: lb-manage
* @description
* @author: LiuBao
* @create: 2020-07-30 10:38
**/
public class TaskTest {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
try {
// 创建定时器
ChargeTriggerUtil.createTask(new ChargeTask(), map,"55" ,new Date());
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
package org.java.admin.manage.quartz;
import java.util.HashMap;
import java.util.Map;
/**
* @program: lb-manage
* @description
* @author: LiuBao
* @create: 2020-07-30 10:38
**/
public class TaskTest2 {
public static void main(String[] args) {
// 删除定时器
Map<String, Object> map = new HashMap<>();
ChargeTriggerUtil.deleteTask("55");
}
}
还有一个问题,在Job里面的方法里,无法注入Bean的问题,解决方案如下
这个SpringUtils 必须得在包下能被扫描到,这个配置才生效
package com.shopx5.socket.config;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext=null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext=applicationContext;
}
public static ApplicationContext getApplicationContext(){
return SpringUtils.applicationContext;
}
public static <T>T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}
讲一下在Job中,如果拿到Bean
package org.java.admin.manage.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @program: lb-manage
* @description 定时任务
* @author: LiuBao
* @create: 2020-07-30 10:03
**/
public class ChargeTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//拿到Bean的方法
UserCoinWalletMapper userCoinWalletMapper = SpringUtils.getBean(UserCoinWalletMapper.class);
System.out.println("定时器被执行了");
}
}
- 还有的就是传参问题 (JobDataMap 可以来传参数)