java基于QuartzJobBean實(shí)現(xiàn)定時(shí)功能的示例代碼
業(yè)務(wù)場(chǎng)景:JAVA實(shí)現(xiàn)一個(gè)定時(shí)發(fā)送郵件的任務(wù)。
我們可以使用QuartzJobBean 來(lái)完成上述功能。QuartzJobBean 是 Quartz 框架中的一個(gè)抽象類,用于定義和實(shí)現(xiàn)可由 Quartz 調(diào)度的作業(yè)(Job)??梢酝ㄟ^(guò)繼承 QuartzJobBean 類并實(shí)現(xiàn)其中的抽象方法來(lái)定義自己的作業(yè)。
以下是一個(gè)基本的使用示例:
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class MyJob extends QuartzJobBean {
? ? @Override
? ? protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
? ? ? ? // 在這里編寫您的作業(yè)邏輯
? ? ? ? System.out.println("MyJob is executing...");
? ? }
}在上面的示例中,我們創(chuàng)建了一個(gè)名為 MyJob 的作業(yè)類,它繼承自 QuartzJobBean。我們需要實(shí)現(xiàn) executeInternal 方法,這是作業(yè)的實(shí)際執(zhí)行邏輯。在這個(gè)方法中,您可以編寫您的作業(yè)代碼。QuartzJobBean 提供了一些有用的功能,例如獲取作業(yè)執(zhí)行上下文(JobExecutionContext)和處理作業(yè)執(zhí)行異常(JobExecutionException)等。
基于上面的介紹,
我們使用 Spring Boot 框架來(lái)實(shí)現(xiàn)基于 QuartzJobBean 的定時(shí)發(fā)送郵件的任務(wù),可以按照以下步驟進(jìn)行操作:
1. 添加依賴
在 Maven 或 Gradle 構(gòu)建文件中添加 Spring Boot 和 Quartz 的相關(guān)依賴。
對(duì)于 Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>2.創(chuàng)建定時(shí)任務(wù)類
創(chuàng)建一個(gè)繼承自 QuartzJobBean 的定時(shí)任務(wù)類,例如 EmailJob,并實(shí)現(xiàn)任務(wù)的邏輯。
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class EmailJob extends QuartzJobBean {
? ? private EmailSender emailSender;
? ? // 通過(guò) setter 方法注入 EmailSender
? ? public void setEmailSender(EmailSender emailSender) {
? ? ? ? this.emailSender = emailSender;
? ? }
? ? @Override
? ? protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
?? ??? ??? ??? ?// 在這里編寫任務(wù)的邏輯
? ? ? ? emailSender.sendEmail();
? ? }
}上述的EmailSender 是通過(guò)setter方法注入的,我們還可以通過(guò)構(gòu)造函數(shù)注入或者使用 Spring 的自動(dòng)裝配(Autowired)功能來(lái)實(shí)現(xiàn)依賴注入。
構(gòu)造函數(shù)注入:
修改 EmailJob 類,添加一個(gè)帶有 EmailSender 參數(shù)的構(gòu)造函數(shù),并在構(gòu)造函數(shù)中進(jìn)行注入。
public class EmailJob extends QuartzJobBean {
? ? private final EmailSender emailSender;
? ? public EmailJob(EmailSender emailSender) {
? ? ? ? this.emailSender = emailSender;
? ? }
? ? // 省略其他代碼...
}在配置類中,使用構(gòu)造函數(shù)注入 EmailSender。
@Configuration
public class QuartzConfig {
? ? private final EmailSender emailSender;
? ? public QuartzConfig(EmailSender emailSender) {
? ? ? ? this.emailSender = emailSender;
? ? }
? ? @Bean
? ? public JobDetailFactoryBean emailJobDetail() {
? ? ? ? JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
? ? ? ? factoryBean.setJobClass(EmailJob.class);
? ? ? ? factoryBean.setDurability(true);
? ? ? ? factoryBean.setConstructorArgumentValues(Collections.singletonMap("emailSender", emailSender));
? ? ? ? return factoryBean;
? ? }
? ? // 省略其他代碼...
}這樣,EmailSender 實(shí)例將通過(guò)構(gòu)造函數(shù)注入到 EmailJob 類中。
自動(dòng)裝配(Autowired)注解:
修改 EmailJob 類,使用 @Autowired 注解標(biāo)記 EmailSender 字段。
public class EmailJob extends QuartzJobBean {
? ? @Autowired
? ? private EmailSender emailSender;
? ? // 省略其他代碼...
}在配置類中使用 @Autowired 注解將 EmailJob 實(shí)例注入到配置類中,然后通過(guò) JobDataMap 將實(shí)例傳遞給 JobDetailFactoryBean
@Configuration
public class QuartzConfig {
? ? @Autowired
? ? private EmailJob emailJob;
? ? @Bean
? ? public JobDetailFactoryBean emailJobDetail() {
? ? ? ? JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
? ? ? ? factoryBean.setJobClass(EmailJob.class);
? ? ? ? factoryBean.setDurability(true);
? ? ? ? factoryBean.setJobDataMap(new JobDataMap(Collections.singletonMap("emailJob", emailJob)));
? ? ? ? return factoryBean;
? ? }
? ? // 省略其他代碼...
}3. 創(chuàng)建郵件發(fā)送類
創(chuàng)建一個(gè)負(fù)責(zé)實(shí)際郵件發(fā)送的類,例如 EmailSender。
public class EmailSender {
public void sendEmail() {
// 實(shí)際的郵件發(fā)送邏輯
System.out.println("發(fā)送郵件...");
}
}4.創(chuàng)建配置類
創(chuàng)建一個(gè)配置類,用于配置 Quartz 調(diào)度器和任務(wù)觸發(fā)器。
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class QuartzConfig {
? ? @Bean
? ? public JobDetailFactoryBean emailJobDetail() {
? ? ? ? JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
? ? ? ? factoryBean.setJobClass(EmailJob.class);
? ? ? ? factoryBean.setDurability(true);
? ? ? ? return factoryBean;
? ? }
? ? @Bean
? ? public CronTriggerFactoryBean emailJobTrigger(JobDetail emailJobDetail) {
? ? ? ? CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
? ? ? ? factoryBean.setJobDetail(emailJobDetail);
? ? ? ? factoryBean.setCronExpression("0 0 8 * * ?"); // 每天 8 點(diǎn)執(zhí)行
? ? ? ? return factoryBean;
? ? }
? ? @Bean
? ? public SchedulerFactoryBean schedulerFactory(Trigger emailJobTrigger) {
? ? ? ? SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
? ? ? ? factoryBean.setTriggers(emailJobTrigger);
? ? ? ? return factoryBean;
? ? }
}在上述配置類中,我們創(chuàng)建了一個(gè) JobDetail 實(shí)例來(lái)指定要執(zhí)行的任務(wù)類,然后創(chuàng)建一個(gè) CronTrigger 實(shí)例來(lái)定義觸發(fā)器的調(diào)度規(guī)則。最后,使用 SchedulerFactoryBean 將觸發(fā)器配置到 Quartz 調(diào)度器中。
5.啟動(dòng)應(yīng)用程序
創(chuàng)建一個(gè) Spring Boot 應(yīng)用程序的入口類,并在其中添加 @EnableScheduling 注解來(lái)啟用調(diào)度任務(wù)。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class Application {
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(Application.class, args);
? ? }
}現(xiàn)在,當(dāng)你啟動(dòng) Spring Boot 應(yīng)用程序時(shí),定時(shí)任務(wù)將按照指定的調(diào)度規(guī)則觸發(fā)執(zhí)行,調(diào)用 EmailJob 類的 executeInternal 方法,進(jìn)而調(diào)用 EmailSender 類的 sendEmail 方法來(lái)發(fā)送郵件。
到此這篇關(guān)于java基于QuartzJobBean實(shí)現(xiàn)定時(shí)功能的示例代碼的文章就介紹到這了,更多相關(guān)java QuartzJobBean定時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中如何對(duì)actuator進(jìn)行關(guān)閉
這篇文章主要介紹了SpringBoot中如何對(duì)actuator進(jìn)行關(guān)閉問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
maven配置多個(gè)鏡像的實(shí)現(xiàn)方法
這篇文章主要介紹了maven配置多個(gè)鏡像的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
關(guān)于使用Mybatisplus自帶的selectById和insert方法時(shí)的一些問(wèn)題
這篇文章主要介紹了關(guān)于使用Mybatisplus自帶的selectById和insert方法時(shí)的一些問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
springboot項(xiàng)目docker分層構(gòu)建的配置方式
在使用dockerfile構(gòu)建springboot項(xiàng)目時(shí),速度較慢,用時(shí)比較長(zhǎng),為了加快構(gòu)建docker鏡像的速度,采用分層構(gòu)建的方式,這篇文章主要介紹了springboot項(xiàng)目docker分層構(gòu)建,需要的朋友可以參考下2024-03-03

