亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringQuartz定時任務(wù)核心組件JobDetail與Trigger配置

 更新時間:2025年04月13日 09:50:16   作者:程序媛學(xué)姐  
Spring框架與Quartz調(diào)度器的集成提供了強大而靈活的定時任務(wù)解決方案,本文主要介紹了SpringQuartz定時任務(wù)核心組件JobDetail與Trigger配置,具有一定的參考價值,感興趣的可以了解一下

引言

在企業(yè)級Java應(yīng)用中,定時任務(wù)是一個常見需求,用于執(zhí)行周期性工作如數(shù)據(jù)清理、報表生成、郵件發(fā)送等。Spring框架與Quartz調(diào)度器的集成提供了強大而靈活的定時任務(wù)解決方案。本文將深入探討Spring Quartz的核心組件:JobDetail與Trigger的配置方式,通過實例代碼展示如何在Spring Boot環(huán)境中實現(xiàn)高效可靠的任務(wù)調(diào)度系統(tǒng)。

一、Spring Quartz基礎(chǔ)架構(gòu)

1.1 核心組件概述

Quartz調(diào)度系統(tǒng)由三個核心組件構(gòu)成:Job、JobDetail和Trigger。Job定義要執(zhí)行的任務(wù)邏輯;JobDetail包含Job的全部屬性和配置;Trigger決定何時觸發(fā)Job執(zhí)行。這三者共同作用,形成了Quartz的基礎(chǔ)調(diào)度架構(gòu)。Scheduler組件則負(fù)責(zé)將JobDetail和Trigger關(guān)聯(lián)起來,管理整個調(diào)度流程。這種解耦設(shè)計使得任務(wù)定義與執(zhí)行時間可以靈活組合。

// Job接口實現(xiàn)示例
public class SampleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 獲取JobDetail中的數(shù)據(jù)
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        String jobData = dataMap.getString("jobData");
        
        // 執(zhí)行業(yè)務(wù)邏輯
        System.out.println("SampleJob執(zhí)行,數(shù)據(jù): " + jobData + ", 時間: " + new Date());
        
        // 任務(wù)上下文操作
        context.setResult("執(zhí)行成功");
    }
}

1.2 Spring集成優(yōu)勢

Spring框架對Quartz進(jìn)行了封裝,簡化了配置流程并提供了更好的依賴管理。通過Spring Boot的自動配置,僅需少量代碼即可創(chuàng)建完整的調(diào)度系統(tǒng)。Spring的事務(wù)管理、依賴注入等特性可無縫應(yīng)用于Quartz任務(wù)。這種集成使得開發(fā)者能夠?qū)W⒂跇I(yè)務(wù)邏輯而非底層調(diào)度機制,同時保持了Quartz的全部功能和靈活性。

// Spring Boot中的Quartz自動配置
@Configuration
@EnableScheduling
public class QuartzConfig {
    
    // 注冊數(shù)據(jù)源,支持持久化
    @Bean
    public DataSource quartzDataSource() {
        return DataSourceBuilder.create()
                .url("jdbc:mysql://localhost:3306/quartz_db")
                .username("root")
                .password("password")
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .build();
    }
    
    // 配置Quartz屬性
    @Bean
    public Properties quartzProperties() {
        Properties properties = new Properties();
        properties.put("org.quartz.scheduler.instanceName", "SpringQuartzScheduler");
        properties.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        properties.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
        properties.put("org.quartz.jobStore.dataSource", "quartzDS");
        properties.put("org.quartz.dataSource.quartzDS.provider", "hikaricp");
        return properties;
    }
}

二、JobDetail深入配置

2.1 JobDetail基本屬性

JobDetail不僅包含要執(zhí)行的Job類信息,還定義了諸多任務(wù)屬性。關(guān)鍵屬性包括任務(wù)名稱、組名、描述、是否持久保存、是否可恢復(fù)等。通過JobDataMap,可以向Job傳遞執(zhí)行所需的參數(shù)。JobBuilder提供了流式API用于構(gòu)建JobDetail,使配置過程更加清晰。

// JobDetail配置示例
@Bean
public JobDetail sampleJobDetail() {
    return JobBuilder.newJob(SampleJob.class)
            .withIdentity("sampleJob", "group1")     // 設(shè)置任務(wù)唯一標(biāo)識
            .withDescription("這是一個示例任務(wù)")       // 添加描述
            .storeDurably(true)                      // 任務(wù)持久保存
            .requestRecovery(true)                   // 故障恢復(fù)
            .usingJobData("jobData", "初始值")        // 傳遞參數(shù)
            .build();
}

2.2 JobDataMap應(yīng)用

JobDataMap是Quartz提供的一種鍵值存儲機制,用于Job間數(shù)據(jù)傳遞??梢栽贘obDetail和Trigger中分別設(shè)置JobDataMap,兩者會在運行時合并。當(dāng)使用Spring管理的Job實例時,可以通過@Autowired注入服務(wù)或通過setter方法自動注入JobDataMap中的值,無需顯式獲取JobDataMap對象。

// JobDataMap高級用法
public class DataTransferJob implements Job {
    
    private String configValue;
    private UserService userService;
    
    // Quartz自動注入JobDataMap中的屬性
    public void setConfigValue(String configValue) {
        this.configValue = configValue;
    }
    
    // Spring依賴注入
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 獲取運行時參數(shù)(兩種方式)
        JobDataMap mergedMap = context.getMergedJobDataMap();
        String runtimeParam = mergedMap.getString("runtimeParam");
        
        // 結(jié)合JobDetail參數(shù)和Spring注入的服務(wù)
        List<User> users = userService.findInactiveUsers();
        users.forEach(user -> {
            System.out.println("處理用戶: " + user.getUsername() + 
                              ", 配置: " + configValue + 
                              ", 運行參數(shù): " + runtimeParam);
        });
    }
}

// 配置JobDetail
@Bean
public JobDetail dataTransferJobDetail() {
    return JobBuilder.newJob(DataTransferJob.class)
            .withIdentity("dataTransferJob")
            .usingJobData("configValue", "系統(tǒng)配置值")
            .storeDurably()
            .build();
}

三、Trigger詳細(xì)配置

3.1 Trigger類型與選擇

Quartz提供了多種Trigger類型,主要包括SimpleTrigger和CronTrigger。SimpleTrigger適合按固定時間間隔執(zhí)行的任務(wù);CronTrigger則使用cron表達(dá)式定義更復(fù)雜的執(zhí)行計劃。其他特殊類型如DailyTimeIntervalTrigger和CalendarIntervalTrigger也可滿足特定場景需求。選擇合適的Trigger類型是實現(xiàn)精確調(diào)度的關(guān)鍵。

// 不同類型的Trigger示例
@Bean
public Trigger simpleTrigger(JobDetail sampleJobDetail) {
    // 簡單觸發(fā)器 - 每隔30秒執(zhí)行一次,無限重復(fù)
    return TriggerBuilder.newTrigger()
            .forJob(sampleJobDetail)
            .withIdentity("simpleTrigger")
            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(30)
                    .repeatForever())
            .build();
}

@Bean
public Trigger cronTrigger(JobDetail dataTransferJobDetail) {
    // Cron觸發(fā)器 - 每天凌晨2點執(zhí)行
    return TriggerBuilder.newTrigger()
            .forJob(dataTransferJobDetail)
            .withIdentity("cronTrigger")
            .withSchedule(CronScheduleBuilder.cronSchedule("0 0 2 * * ?"))
            .build();
}

@Bean
public Trigger dailyIntervalTrigger(JobDetail reportJobDetail) {
    // 每日時間間隔觸發(fā)器 - 工作日9:00-17:00每小時執(zhí)行
    return TriggerBuilder.newTrigger()
            .forJob(reportJobDetail)
            .withIdentity("dailyIntervalTrigger")
            .withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule()
                    .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0))
                    .endingDailyAt(TimeOfDay.hourAndMinuteOfDay(17, 0))
                    .onDaysOfTheWeek(Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, 
                                    Calendar.THURSDAY, Calendar.FRIDAY)
                    .withIntervalInHours(1))
            .build();
}

3.2 Cron表達(dá)式詳解

Cron表達(dá)式是一種強大的時間表達(dá)方式,由6-7個字段組成,分別表示秒、分、時、日、月、周和年(可選)。通過靈活組合這些字段,可以定義從簡單到復(fù)雜的各種執(zhí)行計劃。掌握cron表達(dá)式是使用CronTrigger的關(guān)鍵。常見模式包括按特定時間執(zhí)行、按周期性日期執(zhí)行等。

// Cron表達(dá)式示例及解析
@Bean
public CronTrigger advancedCronTrigger(JobDetail complexJobDetail) {
    // 創(chuàng)建Trigger時,可以添加描述和傳遞參數(shù)
    return TriggerBuilder.newTrigger()
            .forJob(complexJobDetail)
            .withIdentity("advancedCronTrigger", "cronGroup")
            .withDescription("高級Cron觸發(fā)器")
            .usingJobData("runtimeParam", "觸發(fā)器參數(shù)")
            .withSchedule(CronScheduleBuilder.cronSchedule("0 15 10 L * ?")
                    .withMisfireHandlingInstructionFireAndProceed())
            .startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE))
            .endAt(DateBuilder.futureDate(6, DateBuilder.IntervalUnit.MONTH))
            .build();
}

// Cron表達(dá)式常用模式
/*
 * "0 0 12 * * ?"              每天中午12點觸發(fā)
 * "0 15 10 ? * MON-FRI"       周一至周五上午10:15觸發(fā)
 * "0 0/30 9-17 * * ?"         每天9點至17點每半小時觸發(fā)
 * "0 0 10,14,16 * * ?"        每天10點、14點和16點觸發(fā)
 * "0 0 12 ? * WED"            每周三中午12點觸發(fā)
 * "0 15 10 L * ?"             每月最后一天的10:15觸發(fā)
 * "0 15 10 ? * 6L"            每月最后一個周五的10:15觸發(fā)
 */

3.3 高級Trigger配置

Trigger配置不僅限于基本的執(zhí)行計劃,還包括優(yōu)先級、啟動時間、結(jié)束時間和錯過觸發(fā)策略等高級特性。優(yōu)先級決定了資源緊張時的調(diào)度順序;啟動和結(jié)束時間限定了觸發(fā)有效期;錯過觸發(fā)策略則定義了當(dāng)調(diào)度器關(guān)閉時如何處理錯過的觸發(fā)點。這些特性共同保證了調(diào)度系統(tǒng)的可靠性和靈活性。

// 高級Trigger配置示例
@Bean
public Trigger advancedTrigger(JobDetail importantJobDetail) {
    Calendar calendar = new GregorianCalendar(2025, Calendar.DECEMBER, 31);
    
    return TriggerBuilder.newTrigger()
            .forJob(importantJobDetail)
            .withIdentity("advancedTrigger")
            // 設(shè)置優(yōu)先級 (默認(rèn)為5,值越高優(yōu)先級越高)
            .withPriority(10)
            // 設(shè)置開始時間
            .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.HOUR))
            // 設(shè)置結(jié)束時間
            .endAt(calendar.getTime())
            // 設(shè)置調(diào)度器時區(qū)
            .inTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))
            // 配置調(diào)度
            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInMinutes(30)
                    .repeatForever()
                    // 設(shè)置錯過觸發(fā)策略
                    .withMisfireHandlingInstructionNextWithRemainingCount())
            .build();
}

四、實戰(zhàn)應(yīng)用示例

4.1 動態(tài)調(diào)度管理

在實際應(yīng)用中,常需要動態(tài)管理任務(wù)調(diào)度,如添加、修改或刪除任務(wù)。Spring Quartz提供了Scheduler接口用于運行時操控任務(wù)。通過SchedulerFactoryBean配置和注入Scheduler,可以實現(xiàn)任務(wù)的動態(tài)管理、監(jiān)控任務(wù)狀態(tài)、暫停和恢復(fù)等高級功能。這使得調(diào)度系統(tǒng)能夠適應(yīng)業(yè)務(wù)需求的變化。

// 動態(tài)調(diào)度管理
@Service
public class DynamicScheduleService {
    
    @Autowired
    private Scheduler scheduler;
    
    // 動態(tài)添加任務(wù)
    public void scheduleDynamicJob(String jobName, String cronExpression, Map<String, Object> jobData) 
            throws SchedulerException {
        
        // 創(chuàng)建JobDetail
        JobDetail jobDetail = JobBuilder.newJob(DynamicJob.class)
                .withIdentity(jobName)
                .storeDurably()
                .build();
        
        // 設(shè)置JobDataMap
        if (jobData != null) {
            jobDetail.getJobDataMap().putAll(jobData);
        }
        
        // 創(chuàng)建CronTrigger
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(jobName + "Trigger")
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                .build();
        
        // 添加任務(wù)
        scheduler.scheduleJob(jobDetail, trigger);
    }
    
    // 修改任務(wù)調(diào)度時間
    public void rescheduleJob(String triggerName, String cronExpression) throws SchedulerException {
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName);
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        
        // 創(chuàng)建新的Trigger
        CronTrigger newTrigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                .build();
        
        // 更新調(diào)度
        scheduler.rescheduleJob(triggerKey, newTrigger);
    }
    
    // 暫停任務(wù)
    public void pauseJob(String jobName) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName);
        scheduler.pauseJob(jobKey);
    }
    
    // 恢復(fù)任務(wù)
    public void resumeJob(String jobName) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName);
        scheduler.resumeJob(jobKey);
    }
    
    // 刪除任務(wù)
    public void deleteJob(String jobName) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName);
        scheduler.deleteJob(jobKey);
    }
}

總結(jié)

Spring整合Quartz提供了功能強大且配置靈活的任務(wù)調(diào)度解決方案。JobDetail負(fù)責(zé)定義任務(wù)內(nèi)容和配置,包含任務(wù)類、標(biāo)識信息和運行參數(shù);Trigger決定任務(wù)的執(zhí)行時機,支持多種觸發(fā)策略以適應(yīng)不同場景。兩者通過Scheduler關(guān)聯(lián),實現(xiàn)了任務(wù)定義與執(zhí)行時間的解耦。在實際應(yīng)用中,可以根據(jù)業(yè)務(wù)需求選擇合適的調(diào)度類型,設(shè)置適當(dāng)?shù)娜蝿?wù)參數(shù),并利用Spring的依賴注入特性簡化開發(fā)。動態(tài)調(diào)度管理能力進(jìn)一步增強了系統(tǒng)的靈活性,使調(diào)度系統(tǒng)能夠適應(yīng)復(fù)雜多變的業(yè)務(wù)環(huán)境。

到此這篇關(guān)于SpringQuartz定時任務(wù)核心組件JobDetail與Trigger配置的文章就介紹到這了,更多相關(guān)Spring JobDetail與Trigger配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 手把手教你SpringBoot整合Mybatis

    手把手教你SpringBoot整合Mybatis

    這篇文章主要介紹了手把手教你SpringBoot整合Mybatis,Mybatis是一款持久化框架,可以幫我們省去大部分jdbc的代碼,需要的朋友可以參考下
    2023-03-03
  • mybatis調(diào)用存儲過程,帶in、out參數(shù)問題

    mybatis調(diào)用存儲過程,帶in、out參數(shù)問題

    這篇文章主要介紹了mybatis調(diào)用存儲過程,帶in、out參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mybatis詳解在注解sql時報錯的解決方法

    Mybatis詳解在注解sql時報錯的解決方法

    MyBatis-Plus 是一個 Mybatis 增強版工具,在 MyBatis 上擴充了其他功能沒有改變其基本功能,為了簡化開發(fā)提交效率而存在,本篇文章帶你看看在注解sql時所報出的錯誤解決
    2022-03-03
  • 關(guān)于HashSet與HashMap的區(qū)別及說明

    關(guān)于HashSet與HashMap的區(qū)別及說明

    這篇文章主要介紹了關(guān)于HashSet與HashMap的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解DES加密算法的原理與Java實現(xiàn)

    詳解DES加密算法的原理與Java實現(xiàn)

    DES 加密,是對稱加密。對稱加密,顧名思義,加密和解密的運算全都是使用的同樣的秘鑰。這篇文章主要為大家講講DES加密算法的原理與Java實現(xiàn),需要的可以參考一下
    2022-10-10
  • java OOM內(nèi)存泄漏原因及解決方法

    java OOM內(nèi)存泄漏原因及解決方法

    這篇文章主要介紹了java OOM內(nèi)存泄漏原因及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • AQS(AbstractQueuedSynchronizer)抽象隊列同步器及工作原理解析

    AQS(AbstractQueuedSynchronizer)抽象隊列同步器及工作原理解析

    AQS是用來構(gòu)建鎖或者其他同步器組件的重量級基礎(chǔ)框架及整個JUC體系的基石,通過內(nèi)置的FIFO對列來完成資源獲取線程的排隊工作,并通過一個int類型變量表示持有鎖的狀態(tài),本文給大家詳細(xì)介紹下AQS抽象隊列同步器的相關(guān)知識,感興趣的朋友一起看看吧
    2022-03-03
  • SpringBoot整合Echarts實現(xiàn)數(shù)據(jù)大屏

    SpringBoot整合Echarts實現(xiàn)數(shù)據(jù)大屏

    這篇文章給大家介紹了三步實現(xiàn)SpringBoot全局日志記錄,整合Echarts實現(xiàn)數(shù)據(jù)大屏,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-03-03
  • java 兩個數(shù)組合并的幾種方法

    java 兩個數(shù)組合并的幾種方法

    本篇文章主要介紹了java 兩個數(shù)組合并的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 基于FeignException$InternalServerError的解決方案

    基于FeignException$InternalServerError的解決方案

    這篇文章主要介紹了FeignException$InternalServerError的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論