quartz简单实现多任务并发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | package com.scan.xxx.config.quartz; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @Slf4j @Configuration public class QuartzConfig { @Autowired private Scheduler scheduler; @Bean (name = "jobDetail" ) public MethodInvokingJobDetailFactoryBean detailFactoryBean(SchedulerTask task){ MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); /* * 是否并发执行 * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了, * 如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行 */ jobDetail.setConcurrent( true ); //设置并行 jobDetail.setName( "scheduler" ); // 设置任务的名字 jobDetail.setGroup( "scheduler_group" ); // 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用 /* * 这两行代码表示执行task对象中的scheduleTest方法。定时执行的逻辑都在scheduleTest。 */ jobDetail.setTargetObject(task); jobDetail.setTargetMethod( "start" ); return jobDetail; } @Bean (name = "jobTrigger" ) public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) { CronTriggerFactoryBean tigger = new CronTriggerFactoryBean(); tigger.setJobDetail(jobDetail.getObject()); tigger.setCronExpression( "0 0 12 * * ?" ); // 表示每天中午12点 //tigger.set tigger.setName( "myTigger" ); // trigger的name return tigger; } @Bean (name = "scheduler" ) public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) { SchedulerFactoryBean schedulerFactoryBean1 = new SchedulerFactoryBean(); //设置是否任意一个已定义的Job会覆盖现在的Job。默认为false,即已定义的Job不会覆盖现有的Job。 schedulerFactoryBean1.setOverwriteExistingJobs( true ); // 延时启动,应用启动5秒后 ,定时器才开始启动 schedulerFactoryBean1.setStartupDelay( 5 ); // 注册定时触发器 schedulerFactoryBean1.setTriggers(cronJobTrigger); return schedulerFactoryBean1; } //多任务时的Scheduler,动态设置Trigger。一个SchedulerFactoryBean可能会有多个Trigger @Bean (name = "multitaskScheduler" ) public SchedulerFactoryBean schedulerFactoryBean(){ SchedulerFactoryBean bean = new SchedulerFactoryBean(); return bean; } /** * 根据任务名任务组删除 */ } |
配置类
package com.scan.xxx.controller.quartz; import com.scan.xxx.config.quartz.QuartzConfig; import com.scan.xxx.config.quartz.Task1; import com.scan.xxx.config.quartz.Task2; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; @Slf4j @Controller public class QuartzController2 { @Resource(name = "multitaskScheduler") private Scheduler scheduler; @Autowired private QuartzConfig quartzConfig; JobDetail jobDetail; @ResponseBody @RequestMapping("/task1") public Object task1() throws SchedulerException { //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法 jobDetail = JobBuilder .newJob(Task1.class) .withIdentity("job1", "group1") .build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/11 * * * * ?"); // 每3s执行一次 CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); return "任务1"; } @ResponseBody @RequestMapping("/task2") public Object task2() throws SchedulerException { //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法 jobDetail = JobBuilder.newJob(Task2.class).withIdentity("job2", "group1").build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?"); // 每3s执行一次 CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); return "任务2"; } @ResponseBody @RequestMapping("/taskDelete") public void taskDelete(String taskCode, String taskGroup) throws SchedulerException { //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法 delete(taskCode, taskGroup); } public void delete(String taskCode, String taskGroup) throws SchedulerException { JobKey jobKey = new JobKey(taskCode, taskGroup); log.info(jobKey.getName()); JobDetail jobDetail = scheduler.getJobDetail(jobKey); if (jobDetail == null) { log.info("不存在job"); return; } log.info("删除" + jobKey.toString()); scheduler.deleteJob(jobKey); } }
实现类
模拟2个业务类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package com.scan.xxx.config.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.util.Date; public class Task1 implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { String name = jobExecutionContext.getJobDetail().getKey().getName(); System.out.println( "1111执行" +name+ new Date()); } } |
参考 https://blog.csdn.net/cjbfzxz/article/details/114116440
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库