日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Quartz定时任务的基本搭建

發布時間:2023/12/3 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Quartz定时任务的基本搭建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

個人地址:Quartz定時任務的基本搭建

Quartz是一個完全由Java編寫的開源作業調度框架,為在java應用程序中進行作業調度提供了簡單又強大的機制。

Quartz中分為幾個核心概念:

  • Job - 表示一個工作(任務),要執行的具體內容。
  • JobDetail - 表示一個具體的可執行的調度程序,而Job就是這個可執行程序所要執行的內容,另外該調度程序還包含了任務的調度方案和策略。
  • Trigger - 代表一個調度參數的配置(什么時候去調用)。
  • Scheduler - 代表一個調度容器,一個調度容器可以注冊多個“JobDetail”和"Trigger"。當“JobDetail”與“Trigger”組合在一起,就可以被“Scheduler”容器所調度了。
  • 正式開始學習

    正文即將開始兄弟別跑,跑了就不介紹小姐姐給你認識了。(/▽╲)

    😌搭建項目環境

    Tips: 看到這里,默認各位都是老司機了,項目創建就不占用朋友撩妹時間了。💯

    轉入正題 ===》 💞
    既然要學習Quartz第一步肯定是引入相關的依賴包,需要的依賴我列在下面各位英雄自行摘取 ~~

    <!-- 如果是springboot項目呢, 為了方便大家使用springboot已經進行了相關的整合, 僅引入以下starter的方式就完成了整合真的是居家旅行必備良藥(ps.有沒有跟小Y一起走錯片場的呢) --> <!-- SpringBoot quartz依賴 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId> </dependency><!-- 其他(不引入上面starter的方式時引用) --> <!-- Quartz核心依賴 --> <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version><scope>compile</scope> </dependency>

    🙂項目配置

    接下來我們要做的就是在我們的項目中配置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定时任务的基本搭建的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。