简单记录一下基于Quartz-2.2.3动态创建任务的示例:
1.首先,pom.xml引入相关依赖(例子中日志用了log4j2)
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.2</version> </dependency>
2.创建Quartz任务管理类QuartzTaskManager
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class QuartzTaskManager { private static Logger log = LogManager.getLogger(); /** * 任务调度器 */ private Scheduler scheduler; private static QuartzTaskManager me; private QuartzTaskManager() { } public static QuartzTaskManager newInstance() { try { synchronized (log) { if (me == null) { QuartzTaskManager ins = new QuartzTaskManager(); ins.scheduler = StdSchedulerFactory.getDefaultScheduler(); me = ins; } return me; } } catch (SchedulerException e) { log.error("QuartzTaskManager实例化异常", e); return null; } } /** * 运行定时任务管理服务 * * @throws SchedulerException */ public void start() throws SchedulerException { scheduler.start(); } /** * 停止定时任务管理服务 * * @throws SchedulerException */ public void shutdown() throws SchedulerException { scheduler.shutdown(); } /** * 添加任务 * * @param jobName * @param jobGroupName * @param triggerGroupName * @param cronExpression * @throws SchedulerException */ public void addJob(Class<? extends Job> clazz, String jobName, String jobGroupName, String triggerGroupName, String cronExpression) throws SchedulerException { log.info("添加任务{}[{}],cron:{}", jobName, jobGroupName, cronExpression); JobDetail job = JobBuilder.newJob(clazz) .withIdentity(jobName, jobGroupName).build(); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(jobName, triggerGroupName) .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) .build(); scheduler.scheduleJob(job, trigger); } /** * 删除任务 * * @param jobName * @param groupName * @throws SchedulerException */ public void deleteJob(String jobName, String groupName) throws SchedulerException { log.info("停止任务{}[{}]", jobName, groupName); scheduler.deleteJob(new JobKey(jobName, groupName)); } }
3.创建2个测试任务类,实现org.quartz.Job接口
#TestJob
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class TestJob implements Job { private static int runCount = 0; private static Logger log = LogManager.getLogger(); @Override public void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException { log.info("job1-第" + (++runCount) + "次运行"); } }
#TestJob2
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class TestJob2 implements Job { private static int runCount = 0; private static Logger log = LogManager.getLogger(); @Override public void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException { log.info("job2-第" + (++runCount) + "次运行"); } }
4.最后就是测试类Test.java
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.quartz.Job; import org.quartz.SchedulerException; import cn.tinyf.job.QuartzTaskManager; public class Test { private static Logger log = LogManager.getLogger(); public static void main(String[] args) throws Exception { Class<? extends Job> clazz1 = TestJob.class; Class<? extends Job> clazz2 = TestJob2.class; String jobName1 = "testTask-1"; String jobName2 = "testTask-2"; String jobGroupName = "testTaskGroup"; String triggerGroupName = "testTriggerGroup"; String cronExpression1 = "0/5 * * * * ? *"; String cronExpression2 = "0/6 * * * * ? *"; QuartzTaskManager manager = QuartzTaskManager.newInstance(); if (manager != null) { log.info("=========开启定时任务========="); manager.start(); // job1 manager.addJob(clazz1, jobName1, jobGroupName, triggerGroupName + "1", cronExpression1); // job2 manager.addJob(clazz2, jobName2, jobGroupName, triggerGroupName + "2", cronExpression2); } Thread.sleep(30000); try { manager.deleteJob(jobName2, jobGroupName); } catch (SchedulerException e) { e.printStackTrace(); } Thread.sleep(30000); manager.shutdown(); } }