Springboot整合quartz(二)

1.Quartz示例


public class JobTest implements Job {
 
    /**
     * 具體執行的任務
     *
     * @param jobExecutionContext 保存着該job運行時的一些信息
     */
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        //執行job的scheduler的引用
        Scheduler scheduler = jobExecutionContext.getScheduler();
        //觸發job的trigger的引用
        Trigger trigger = jobExecutionContext.getTrigger();
        //JobDetail對象引用,以及一些其它信息
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        //獲取參數
        //jobExecutionContext中的JobDataMap:他是JobDetail中的JobDataMap和Trigger中的JobDataMap的並集
        JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
        Object jobDetailValue = jobDataMap.get("jobDetailKey");
        Object simpleTriggerValue = jobDataMap.get("simpleTriggerKey");
        Object cronTriggerValue = jobDataMap.get("cronTriggerKey");
        //任務執行詳情
        String key = "jobDetailValue:" + jobDetailValue + " simpleTriggerValue:" + simpleTriggerValue + " cronTriggerValue:" + cronTriggerValue;
        System.err.println(new Date() + ": doing something...獲取到的key:" + key);
    }
}
 
class QuartzTest {
    public static void main(String[] args) throws Exception {
        //1、創建JobDetial對象
//        每次當scheduler執行job時,在調用其execute(…)方法之前會創建JobTest類的一個新的實例
        JobDetail jobDetail = JobBuilder.newJob(JobTest.class)
                //設置JobDetial的分組和名稱
                .usingJobData("jobDetailKey", "jobDetailValue")
                .withIdentity("job1", "group1")
                .build();
 
        //2、創建Trigger對象:SimpleTrigger
        Trigger simpleTrigger = newTrigger()
                //設置觸發器的分組和名稱
                .withIdentity("simpleTrigger", "simpleTriggerGroup")
                //開始時間
                .startAt(new Date())
                //結束時間
                .endAt(new Date())
                //設置優先級
                .withPriority(1)
                //設置參數
                .usingJobData("simpleTriggerKey", "simpleTriggerValue")
                .withSchedule(simpleSchedule()
                        //每隔一秒執行一次
                        .withIntervalInSeconds(1)
                        //一直執行
                        .repeatForever())
                .build();
 
        //創建Trigger對象:CronTrigger
        CronTrigger cronTrigger = newTrigger()
                .usingJobData("cronTriggerKey", "cronTriggerValue")
                .withIdentity("cronTrigger", "cronTriggerGroup")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?"))
                //設置優先級
                .withPriority(1)
                .build();
 
        //3、創建調度器:Scheduler
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        //配置JobDetail和Trigger對象
        scheduler.scheduleJob(jobDetail, cronTrigger);
        //4、並執行啓動、關閉等操作
        scheduler.start();
        Thread.sleep(10000);
 
        //關閉調度器:是否等待job執行完成才關閉
        scheduler.shutdown(true);
        System.err.println("-------關閉調度器-------");
 
    }
}

2.Springboot集成quartz

2.1添加依賴

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

2.2自動裝配介紹

我們可以再spingboot的自動裝配源碼可以看到quartz定義瞭如下的接口和類:

  • JobStoreType 該類是一個枚舉類型,定義了對應application.ymlapplication.properties文件內spring.quartz.job-store-type配置,其目的是配置quartz任務的數據存儲方式,分別爲:MEMORY(內存方式:默認)、JDBC(數據庫方式)。

  • QuartzAutoConfiguration 該類是自動配置的主類,內部配置了SchedulerFactoryBean以及JdbcStoreTypeConfiguration,使用QuartzProperties作爲屬性自動化配置條件。

  • QuartzDataSourceInitializer 該類主要用於數據源初始化後的一些操作,根據不同平臺類型的數據庫進行選擇不同的數據庫腳本。

  • QuartzProperties 該類對應了spring.quartzapplication.ymlapplication.properties文件內開頭的相關配置。

  • SchedulerFactoryBeanCustomizer 這是一個接口,我們實現該接口後並且將實現類使用Spring IOC託管,可以完成SchedulerFactoryBean的個性化設置,這裏的設置完全可以對SchedulerFactoryBean做出全部的設置變更。

2.3繼承QuartzJobBean

繼承QuartzJobBean並重寫executeInternal方法,與之前的實現Job`接口類似

/**
 * @Author smallmartial
 * @Date 2020/4/19
 * @Email [email protected]
 */
public class SampleJob  extends QuartzJobBean {

    //作業可以定義設置器以注入數據映射屬性。常規豆也可以類似的方式注入,如以下示例所示:
    @Autowired
    private TestService testService;
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        testService.test();
        System.out.println("    Hi! :" + jobExecutionContext.getJobDetail().getKey());
    }
}

這裏TestService打印一條uuid模擬調用service的場景

2.4添加配置類

@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail uploadTaskDetail() {
        return JobBuilder.newJob(SampleJob.class).withIdentity("mjtTask").storeDurably().build();
    }

    @Bean
    public Trigger uploadTaskTrigger() {
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
        return TriggerBuilder.newTrigger().forJob(uploadTaskDetail())
                .withIdentity("mjtTask")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

2.5運行結果如下

源碼地址 https://github.com/smallmartial/springbootdemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章