Quartz定时任务的基本搭建
前言
個人地址:Quartz定時任務的基本搭建
Quartz是一個完全由Java編寫的開源作業調度框架,為在java應用程序中進行作業調度提供了簡單又強大的機制。
Quartz中分為幾個核心概念:
正式開始學習
正文即將開始兄弟別跑,跑了就不介紹小姐姐給你認識了。(/▽╲)
😌搭建項目環境
Tips: 看到這里,默認各位都是老司機了,項目創建就不占用朋友撩妹時間了。💯
轉入正題 ===》 💞
既然要學習Quartz第一步肯定是引入相關的依賴包,需要的依賴我列在下面各位英雄自行摘取 ~~
🙂項目配置
接下來我們要做的就是在我們的項目中配置Quartz相關的配置類。
?? 首先:
我們知道quartz的幾個核心概念中主要控制調度任務是由Scheduler調度器進行操作的,所以我們首先需要向Spring容器注入一個Scheduler調度器。
@Configuration public class QuartzConfig {/*** 注冊調度器創建工廠* @return 調度器工廠* @throws IOException ioe*/@Beanpublic SchedulerFactoryBean schedulerFactoryBean() throws IOException {PropertiesFactoryBean props = new PropertiesFactoryBean();props.setLocation(new ClassPathResource("/config/quartz.properties"));props.afterPropertiesSet();// 創建調度器工廠SchedulerFactoryBean factory = new SchedulerFactoryBean();factory.setQuartzProperties(Objects.requireNonNull(props.getObject()));return factory;}/*** 注冊調度器* @return 調度器* @throws IOException ioe*/@Beanpublic Scheduler scheduler() throws IOException {return schedulerFactoryBean().getScheduler();} }以上配置僅為最簡單的調度器注冊方式,后續會根據相關api完善更多高級特性
??其次:
現在我們已經將Scheduler調度器注入到容器中,那我們現在需要做些什么?根據前言說到的“調度器”需要“JobDetail”和“Trigger”兩樣必須品才能開始進行任務調度。那么我們現在就需要將這兩個必要參數交給Scheduler。
創建一個存放生成任務的實體
@Data public class QuartzJob implements Serializable {private static final long serialVersionUID = 6481700930972512111L;/*** 任務名稱*/private String jobName;/*** cron表達式*/private String cron;/*** bean全路徑*/private String beanClass;/*** 任務分組*/private String jobGroup;/*** 執行參數*/private String jobData; }創建生成任務的工具類
@Component public class QuartzJobUtil {@Resourceprivate Scheduler scheduler;/*** 添加任務* @param quartzJob job* @throws Exception e*/public void addJob(QuartzJob quartzJob) throws Exception {CronTrigger trigger = (CronTrigger) scheduler.getTrigger(TriggerKey.triggerKey(quartzJob.getJobName(), quartzJob.getJobGroup()));if (trigger != null) {return;}Class<?> clazz = Class.forName(quartzJob.getBeanClass());String quartzJobData = quartzJob.getJobData();Map dateMap = new HashMap<>();if (StrUtil.isNotBlank(quartzJobData)) {dateMap = (Map) JSON.parse(quartzJobData);}JobDataMap data = new JobDataMap(dateMap);JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) clazz).withIdentity(quartzJob.getJobName(), quartzJob.getJobGroup()).setJobData(data).build();// 表達式調度構建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCron());// 按新的表達式構建一個新的triggertrigger = TriggerBuilder.newTrigger().withIdentity(quartzJob.getJobName(), quartzJob.getJobGroup()).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);} }??創建HelloWorld任務
正所謂一切皆從hello world開始,所以我們需要創建一個HelloWorldJob來完成測試功能。
@Slf4j public class HelloWorldJob implements Job {private Logger logger = LoggerFactory.getLogger(HelloWorldJob.class);private AtomicInteger counter = new AtomicInteger(0);@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 在這里我們簡單的進行一下日志打印操作, 來證明任務被調度器調用logger.info("helloWorldJob執行第 {} - 次", counter.incrementAndGet());} }??將Job交給調度器
我們這里通過@PostConstruct注解在項目啟動時,將HelloWorldJob交給調度器,讓調度器進行管理并調用。
@PostConstruct public void initializeJob() {// 啟動時, 將job們加載至調度器中try {QuartzJob job = new QuartzJob();job.setJobName("helloWorldJob");job.setJobGroup("hello");job.setBeanClass(HelloWorldJob.class.getName());// 每分鐘執行一次job.setCron("0 0/1 * * * ?");quartzJobUtil.addJob(job);} catch (Exception e) {log.error("定時任務加載失敗....");e.printStackTrace();} }💯測試結果
我們Cron表達式設置的從0開始一分鐘執行一次,所以當我們項目啟動后,每到一分鐘調度器就回執行一次我們的HelloWorld任務啦~😀
🔚End
本次學習結束~ 期待下一次學習分享~
總結
以上是生活随笔為你收集整理的Quartz定时任务的基本搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 桌面电脑越小越好电脑桌面特别小
- 下一篇: JAVA实现一个图片上传预览功能