java基于QuartzJobBean实现定时功能的示例代码
作者:凭栏听雨客
业务场景:JAVA实现一个定时发送邮件的任务。
我们可以使用QuartzJobBean 来完成上述功能。QuartzJobBean 是 Quartz 框架中的一个抽象类,用于定义和实现可由 Quartz 调度的作业(Job)。可以通过继承 QuartzJobBean 类并实现其中的抽象方法来定义自己的作业。
以下是一个基本的使用示例:
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 { // 在这里编写您的作业逻辑 System.out.println("MyJob is executing..."); } }
在上面的示例中,我们创建了一个名为 MyJob 的作业类,它继承自 QuartzJobBean。我们需要实现 executeInternal 方法,这是作业的实际执行逻辑。在这个方法中,您可以编写您的作业代码。QuartzJobBean 提供了一些有用的功能,例如获取作业执行上下文(JobExecutionContext)和处理作业执行异常(JobExecutionException)等。
基于上面的介绍,
我们使用 Spring Boot 框架来实现基于 QuartzJobBean 的定时发送邮件的任务,可以按照以下步骤进行操作:
1. 添加依赖
在 Maven 或 Gradle 构建文件中添加 Spring Boot 和 Quartz 的相关依赖。
对于 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.创建定时任务类
创建一个继承自 QuartzJobBean 的定时任务类,例如 EmailJob,并实现任务的逻辑。
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class EmailJob extends QuartzJobBean { private EmailSender emailSender; // 通过 setter 方法注入 EmailSender public void setEmailSender(EmailSender emailSender) { this.emailSender = emailSender; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { // 在这里编写任务的逻辑 emailSender.sendEmail(); } }
上述的EmailSender 是通过setter方法注入的,我们还可以通过构造函数注入或者使用 Spring 的自动装配(Autowired)功能来实现依赖注入。
构造函数注入:
修改 EmailJob 类,添加一个带有 EmailSender 参数的构造函数,并在构造函数中进行注入。
public class EmailJob extends QuartzJobBean { private final EmailSender emailSender; public EmailJob(EmailSender emailSender) { this.emailSender = emailSender; } // 省略其他代码... }
在配置类中,使用构造函数注入 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 实例将通过构造函数注入到 EmailJob 类中。
自动装配(Autowired)注解:
修改 EmailJob 类,使用 @Autowired 注解标记 EmailSender 字段。
public class EmailJob extends QuartzJobBean { @Autowired private EmailSender emailSender; // 省略其他代码... }
在配置类中使用 @Autowired 注解将 EmailJob 实例注入到配置类中,然后通过 JobDataMap 将实例传递给 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. 创建邮件发送类
创建一个负责实际邮件发送的类,例如 EmailSender。
public class EmailSender { public void sendEmail() { // 实际的邮件发送逻辑 System.out.println("发送邮件..."); } }
4.创建配置类
创建一个配置类,用于配置 Quartz 调度器和任务触发器。
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 点执行 return factoryBean; } @Bean public SchedulerFactoryBean schedulerFactory(Trigger emailJobTrigger) { SchedulerFactoryBean factoryBean = new SchedulerFactoryBean(); factoryBean.setTriggers(emailJobTrigger); return factoryBean; } }
在上述配置类中,我们创建了一个 JobDetail 实例来指定要执行的任务类,然后创建一个 CronTrigger 实例来定义触发器的调度规则。最后,使用 SchedulerFactoryBean 将触发器配置到 Quartz 调度器中。
5.启动应用程序
创建一个 Spring Boot 应用程序的入口类,并在其中添加 @EnableScheduling 注解来启用调度任务。
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); } }
现在,当你启动 Spring Boot 应用程序时,定时任务将按照指定的调度规则触发执行,调用 EmailJob 类的 executeInternal 方法,进而调用 EmailSender 类的 sendEmail 方法来发送邮件。
到此这篇关于java基于QuartzJobBean实现定时功能的示例代码的文章就介绍到这了,更多相关java QuartzJobBean定时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!