Requirement: If an order is placed but has not been paid for a long time, it should be given a time for it to be automatically cancelled.
Maven +ssm+springboot
Quartz old brand products, support persistence, it is very convenient and simple to use
Advantages: relatively simple
Disadvantages: In the case of high concurrency, there will be a large number of scheduled tasks. cause performance impact.
Add jar package
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> |
Add configuration class for scheduled tasks
@Configuration public class QuartzConfig { @Bean public JobDetail newJob () { return JobBuilder. newJob (PrintTimeJob. class ) //PrintTimeJob our business class .withIdentity( "9527" ) // You can give the JobDetail an id //There is a Map in each JobDetail, which contains the data associated with this Job, which can be obtained through context in the Job class .usingJobData( "msg" , "Hello Quartz" ) // Associating key-value pairs .storeDurably() // The JobDetail does not need to be deleted even if there is no Trigger association .build(); } @Bean public Trigger printTimeJobTrigger () { CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ? "); return TriggerBuilder.newTrigger() .forJob(newJob()) // Associate the above JobDetail .withIdentity( "quartzTaskService" ) // Give the Trigger a name .withSchedule(cronScheduleBuilder) .build(); } }
|
business class
/** * 定时任务业务处理类,我们继承QuartzJobBean * 重写executeInternal方法来实现具体的定时业务逻辑 */ public class PrintTimeJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { //获取JobDetail中关联的数据 String msg = (String) context.getJobDetail().getJobDataMap().get("msg"); System.out.println("current time :"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "---" + msg); } }
|
配置数据源
//Quartz配置 - scheduler @Configuration public class QuartzConfig { //主数据源 @Bean @Primary //主数据库,指向pethome @ConfigurationProperties(prefix = "spring.datasource") DataSource dataSource(){ return DataSourceBuilder.create().build(); } //为quartz创建一个自己数据源 @Bean @QuartzDataSource //quartz数据源 @ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource") DataSource quartzDataSource(){ return DataSourceBuilder.create().build(); }
|
持久化和配置百度
添加工具类
package cn. eson.quartz.job; import static org.quartz.CronScheduleBuilder.cronSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.CronTrigger; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerKey; /** * Quartz调度管理器 * */ public class QuartzUtils { private static String JOB_GROUP_NAME = "JOB_GROUP_SYSTEM"; private static String TRIGGER_GROUP_NAME = "TRIGGER_GROUP_SYSTEM"; /** * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 * * @param sched * 调度器 * * @param jobName * 任务名 * @param cls * 任务 * @param params * 任务参数 * @param time * 时间设置,参考quartz说明文档 * * @Title: QuartzManager.java */ public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, Object params, String time) { try { JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);// 任务名,任务组,任务执行类 @SuppressWarnings("unchecked") JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("params", params); JobDetail jobDetail = newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build(); TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);// 触发器 System.out.println(time); Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();// 触发器时间设定 sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start();// 启动 } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 添加一个定时任务 * * @param sched * 调度器 * * @param jobName * 任务名 * @param jobGroupName * 任务组名 * @param triggerName * 触发器名 * @param triggerGroupName * 触发器组名 * @param jobClass * 任务 * @param params * 任务参数 * @param time * 时间设置,参考quartz说明文档 * * @Title: QuartzManager.java */ public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass, Object params, String time) { try { JobKey jobKey = new JobKey(jobName, jobGroupName); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("params", params); @SuppressWarnings("unchecked") JobDetail jobDetail = newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build(); // 触发器 TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName); Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build(); sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) * * @param sched * 调度器 * @param jobName * @param time * * @Title: QuartzManager.java */ @SuppressWarnings("rawtypes") public static void modifyJobTime(Scheduler sched, String jobName, String time) { try { TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME); JobDetail jobDetail = sched.getJobDetail(jobKey); Class objJobClass = jobDetail.getJobClass(); Object params = jobDetail.getJobDataMap().get("params"); removeJob(sched, jobName); System.out.println("修改任务:" + jobName); addJob(sched, jobName, objJobClass, params,time); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一个任务的触发时间 * * @param sched * 调度器 * * @param sched * 调度器 * @param triggerName * @param triggerGroupName * @param time * * @Title: QuartzManager.java */ public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) { try { TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { // 修改时间 trigger.getTriggerBuilder().withSchedule(cronSchedule(time)); // 重启触发器 sched.resumeTrigger(triggerKey); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名) * * @param sched * 调度器 * @param jobName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName) { try { TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME); sched.deleteJob(jobKey);// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一个任务 * * @param sched * 调度器 * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName) { try { TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 JobKey jobKey = new JobKey(jobName, jobGroupName); sched.deleteJob(jobKey);// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:启动所有定时任务 * * @param sched 调度器 * * @Title: QuartzManager.java */ public static void startJobs(Scheduler sched) { try { sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:关闭所有定时任务 * * @param sched * 调度器 * */ public static void shutdownJobs(Scheduler sched) { try { if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } }
|
使用工具类实现添加和删除任务
添加定时任务
删除定时任务
给任务传递参数
package cn. eson; import cn.eson.quartz.PrintTimeJob; import cn. eson.quartz.util.QuartzUtils; import lombok.Data; import org.junit.Test; import org.quartz.Scheduler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import java.io.Serializable; public class QuartzUtilTest extends BaseTest { @Autowired private SchedulerFactoryBean factoryBean; @Test public void test() throws Exception{ System.out.println(factoryBean); //1 创建定时任务 Scheduler sched = factoryBean.getScheduler(); String jobName = "myJob"; Class cls = PrintTimeJob.class; // Object params = "zs"; //传字符串 //传对象 Object params = new User(1L,"zs"); //传字符串 //传对象 String time = "0/1 * * * * ?"; QuartzUtils.addJob(sched,jobName,cls,params,time); //2 睡眠一下 Thread.sleep(10000); //3 删除定时任务 QuartzUtils.removeJob(sched,jobName); //让程序不结束 Thread.sleep(100000000); } } @Data class User implements Serializable { private Long id; private String name; public User(Long id, String name) { this.id = id; this.name = name; } public User() { } }
|