In the spring framework, the timing task can be implemented through @Schedule. Through the rules described by the attribute description of cron, spring will call this method.
spring has implemented timing tasks simply and roughly, why use Quartz?
If you have many timed tasks now, the rules are different, for example:
maven dependency
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>
The following is the source code of the bootdo open source learning framework
I didn't use all the fields, the idea is to query the DB first.
Encapsulate the following two objects
When the trigger condition is met, the class will be found based on the set beanClass (org.quartz.Job must be implemented). At this time, the data in the JobDetail can be retrieved and the specific business logic can be executed.
@Componentpublic class WelcomeJob implements Job{ @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { //Your business logic}}Table structure
CREATE TABLE `sys_task` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `cronExpression` varchar(255) DEFAULT NULL COMMENT 'cron expression', `methodName` varchar(255) DEFAULT NULL COMMENT 'The method name of the task call', `isConcurrent` varchar(255) DEFAULT NULL COMMENT 'Is the task stateful', `description` varchar(255) DEFAULT NULL COMMENT 'Task Description', `updateBy` varchar(64) DEFAULT NULL COMMENT 'Updator', `beanClass` varchar(255) DEFAULT NULL COMMENT 'Which class is called when the task is executed', `createDate` datetime DEFAULT NULL COMMENT 'Create time', `jobStatus` varchar(255) DEFAULT NULL COMMENT 'Task status', `jobGroup` varchar(255) DEFAULT NULL COMMENT 'Task grouping', `updateDate` datetime DEFAULT NULL COMMENT 'Update time', `createBy` varchar(64) DEFAULT NULL COMMENT 'creator', `springBean` varchar(255) DEFAULT NULL COMMENT 'Spring bean', `jobName` varchar(255) DEFAULT NULL COMMENT 'Task name', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
Configuration class
import java.io.IOException;import java.util.Properties;import org.quartz.Scheduler;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.PropertiesFactoryBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import com.txgl.common.quartz.factory.JobFactory;@Configurationpublic class QuartzConfigration { @Autowired JobFactory jobFactory; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); try { schedulerFactoryBean.setOverwriteExistingJobs(true); schedulerFactoryBean.setQuartzProperties(quartzProperties()); schedulerFactoryBean.setJobFactory(jobFactory); } catch (IOException e) { e.printStackTrace(); } return schedulerFactoryBean; } // Specify quartz.properties @Bean public Properties quartzProperties() throws IOException { PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.setLocation(new ClassPathResource("/config/quartz.properties")); propertiesFactoryBean.afterPropertiesSet(); return propertiesFactoryBean.getObject(); } // Create schedule @Bean(name = "scheduler") public Scheduler scheduler() { return schedulerFactoryBean().getScheduler(); }}The code of QuartzManager is the key to operate on tasks by injecting Scheduler
import java.util.ArrayList;import java.util.List;import java.util.Set;import org.apache.log4j.Logger;import org.quartz.CronScheduleBuilder;import org.quartz.CronTrigger;import org.quartz.DateBuilder;import org.quartz.DateBuilder.IntervalUnit;import org.quartz.Job;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.JobExecutionContext;import org.quartz.JobKey;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.TriggerKey;import org.quartz.impl.matchers.GroupMatcher;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import org.springframework.stereotype.Service;import org.springframework.web.context.support.SpringBeanAutowiringSupport;import com.bootdo.common.domain.ScheduleJob;import com.bootdo.common.quartz.factory.*;import com.bootdo.common.utils.SpringContextHolder;;/** * * * @title: QuartzManager.java * @description: Scheduled Task Management* */@Servicepublic class QuartzManager { public final Logger log = Logger.getLogger(this.getClass()); // private SchedulerFactoryBean schedulerFactoryBean // =SpringContextHolder.getBean(SchedulerFactoryBean.class); // @Autowired // @Qualifier("schedulerFactoryBean") // private SchedulerFactoryBean schedulerFactoryBean; @Autowired private Scheduler scheduler; /** * Add task* * @param scheduleJob * @throws SchedulerException */ public void addJob(ScheduleJob job) { try { // Create a jobDetail instance, bind the job implementation class // Specify the name of the job, the name of the group, and bind the job class Class<? extends Job> jobClass = (Class<? extends Job>) (Class.forName(job.getBeanClass()).newInstance() .getClass()); JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(job.getJobName(), job.getJobGroup())// Task name and group form the task key .build(); // Define the dispatch trigger rule// Use cornTrigger rule Trigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// Trigger key .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND)) .withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).startNow().build(); // Register the job and trigger in the task scheduler.scheduleJob(jobDetail, trigger); // Start if (!scheduler.isShutdown()) { scheduler.start(); } } catch (Exception e) { e.printStackTrace(); } }// public void addJob(ScheduleJob job) throws SchedulerException {// if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus())) {// return;// }//// TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());//// CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);//// // If (null == trigger) {// Class<? extends Job> clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent())// ? QuartzJobFactory.class// : QuartzJobFactoryDisallowConcurrentExecution.class;//// JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getJobName(), job.getJobGroup()).build();//// jobDetail.getJobDataMap().put("scheduleJob", job);//// CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());//// trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// .withSchedule(scheduleBuilder).build();//// scheduler.scheduleJob(jobDetail, trigger);// } else {// // Trigger already exists, then update the corresponding timing settings //// CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());//// // Rebuild trigger according to the new cronExpression expression//// trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();//// // Reset the job according to the new trigger//// scheduler.rescheduleJob(triggerKey, trigger);// }// } /** * Get the list of all scheduled tasks* * @return * @throws SchedulerException */ public List<ScheduleJob> getAllJob() throws SchedulerException { GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup(); Set<JobKey> jobKeys = scheduler.getJobKeys(matcher); List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(); for (JobKey jobKey: jobKeys) { List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey); for (Trigger trigger: triggers) { ScheduleJob job = new ScheduleJob(); job.setJobName(jobKey.getName()); job.setJobGroup(jobKey.getGroup()); job.setDescription("trigger:" + trigger.getKey()); Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); job.setJobStatus(triggerState.name()); if (trigger instance of CronTrigger) { CronTrigger cronTrigger = (CronTrigger) trigger; String cronExpression = cronTrigger.getCronExpression(); job.setCronExpression(cronExpression); } jobList.add(job); } } return jobList; } /** * All running jobs * * @return * @throws SchedulerException */ public List<ScheduleJob> getRunningJob() throws SchedulerException { List<JobExecutionContext> executeJobs = scheduler.getCurrentlyExecutingJobs(); List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size()); for (JobExecutionContext executionJob: executionJobs) { ScheduleJob job = new ScheduleJob(); JobDetail jobDetail = executionJob.getJobDetail(); JobKey jobKey = jobDetail.getKey(); Trigger trigger = executionJob.getTrigger(); job.setJobName(jobKey.getName()); job.setJobGroup(jobKey.getGroup()); job.setDescription("trigger:" + trigger.getKey()); Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); job.setJobStatus(triggerState.name()); if (trigger instance of CronTrigger) { CronTrigger cronTrigger = (CronTrigger) trigger; String cronExpression = cronTrigger.getCronExpression(); job.setCronExpression(cronExpression); } jobList.add(job); } return jobList; } /** * Pause a job * * @param scheduleJob * @throws SchedulerException */ public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.pauseJob(jobKey); } /** * Restoring a job * * @param scheduleJob * @throws SchedulerException */ public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.resumeJob(jobKey); } /** * Delete a job * * @param scheduleJob * @throws SchedulerException */ public void deleteJob(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.deleteJob(jobKey); } /** * Execute job immediately * * @param scheduleJob * @throws SchedulerException */ public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.triggerJob(jobKey); } /** * Update job time expression* * @param scheduleJob * @throws SchedulerException */ public void updateJobCron(ScheduleJob scheduleJob) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); scheduler.rescheduleJob(triggerKey, trigger); }}Service implementation
import com.bootdo.common.config.Constant;import com.bootdo.common.dao.TaskDao;import com.bootdo.common.domain.ScheduleJob;import com.bootdo.common.domain.TaskDO;import com.bootdo.common.quartz.utils.QuartzManager;import com.bootdo.common.service.JobService;import com.bootdo.common.utils.ScheduleJobUtils;import org.quartz.SchedulerException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.HashMap;import java.util.List;import java.util.Map;@Servicepublic class JobServiceImpl implements JobService { @Autowired private TaskDao taskScheduleJobMapper; @Autowired QuartzManager quartzManager; @Override public TaskDO get(Long id) { return taskScheduleJobMapper.get(id); } @Override public List<TaskDO> list(Map<String, Object> map) { return taskScheduleJobMapper.list(map); } @Override public int count(Map<String, Object> map) { return taskScheduleJobMapper.count(map); } @Override public int save(TaskDO taskScheduleJob) { return taskScheduleJobMapper.save(taskScheduleJob); } @Override public int update(TaskDO taskScheduleJob) { return taskScheduleJobMapper.update(taskScheduleJob); } @Override public int remove(Long id) { try { TaskDO scheduleJob = get(id); quartzManager.deleteJob(ScheduleJobUtils.entityToData(scheduleJob)); return taskScheduleJobMapper.remove(id); } catch (SchedulerException e) { e.printStackTrace(); return 0; } } @Override public int batchRemove(Long[] ids) { for (Long id : ids) { try { TaskDO scheduleJob = get(id); quartzManager.deleteJob(ScheduleJobUtils.entityToData(scheduleJob)); } catch (SchedulerException e) { e.printStackTrace(); return 0; } } return taskScheduleJobMapper.batchRemove(ids); } @Override public void initSchedule() throws SchedulerException { // Get the task information data here List<TaskDO> jobList = taskScheduleJobMapper.list(new HashMap<String, Object>(16)); for (TaskDO scheduleJob : jobList) { if ("1".equals(scheduleJob.getJobStatus())) { ScheduleJob job = ScheduleJobUtils.entityToData(scheduleJob); quartzManager.addJob(job); } } } @Override public void changeStatus(Long jobId, String cmd) throws SchedulerException { TaskDO scheduleJob = get(jobId); if (scheduleJob == null) { return; } if (Constant.STATUS_RUNNING_STOP.equals(cmd)) { quartzManager.deleteJob(ScheduleJobUtils.entityToData(scheduleJob)); scheduleJob.setJobStatus(ScheduleJob.STATUS_NOT_RUNNING); } else { if (!Constant.STATUS_RUNNING_START.equals(cmd)) { } else { scheduleJob.setJobStatus(ScheduleJob.STATUS_RUNNING); quartzManager.addJob(ScheduleJobUtils.entityToData(scheduleJob)); } } update(scheduleJob); } @Override public void updateCron(Long jobId) throws SchedulerException { TaskDO scheduleJob = get(jobId); if (scheduleJob == null) { return; } if (ScheduleJob.STATUS_RUNNING.equals(scheduleJob.getJobStatus())) { quartzManager.updateJobCron(ScheduleJobUtils.entityToData(scheduleJob)); } update(scheduleJob); }}Start a listener to initialize Quartz
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.core.annotation.Order;import org.springframework.steretype.Component;import com.bootdo.common.quartz.utils.QuartzManager;import com.bootdo.common.service.JobService;@Component@Order(value = 1)public class ScheduleJobInitListener implements CommandLineRunner { @Autowired JobService scheduleJobService; @Autowired QuartzManager quartzManager; @Override public void run(String... arg0) throws Exception { try { scheduleJobService.initSchedule(); } catch (Exception e) { e.printStackTrace(); } }}The above is all the content of this article. I hope it will be helpful to everyone's learning and I hope everyone will support Wulin.com more.