Spring是一个开源的JavaEE框架,它的核心是IoC(Inverse of Control)和AOP(Aspect Oriented Programming)。Spring 的IoC容器是一个轻量级、高性能的Java对象容器,可以方便地管理Java组件及其依赖关系,使Java开发变得非常容易和方便。
在 Spring 核心模块中,提供了一个强大的调度框架——Spring Task;而在 Spring Task 模块中,提供了管理调度框架的 Beans。其中,SchedulerFactoryBean 是 Spring Task 中创建调度器的 Bean 工厂。
本文将会对 SchedulerFactoryBean 进行详细介绍,包括它的配置、使用方法和案例说明,希望能够帮助读者更加深入了解和灵活使用 Spring Task 调度框架。
一、SchedulerFactoryBean 配置
1、依赖配置
首先,在 pom.xml 文件中,我们需要添加相应的依赖。在 Spring Boot 2.x 版本中,只需要添加 spring-boot-starter-quartz 依赖即可,因为 Spring Boot 2.x 自带 Spring Task 和 Quartz。
```
```
在 Spring Boot 1.x 版本中,则需要添加 spring-context-support、spring-tasks 和 quartz 三个依赖。
```
```
需要注意的是,上述依赖中的 spring.version 和 quartz.version 需要根据实际情况进行修改。
2、配置 SchedulerFactoryBean
SchedulerFactoryBean 是 Spring 集成 Quartz 的关键组件之一,可以使用该组件创建 Quartz 调度器实例并进行配置。
首先,在 Spring Boot 应用程序中使用 SchedulerFactoryBean,我们需要在配置文件(application.yml 或 application.properties)中添加如下配置:
```
spring:
# Quartz properties
quartz:
job-store-type: jdbc
auto-startup: true
jdbc:
initialize-schema: always
```
这允许我们通过在 Spring 应用程序上下文中配置一个 SchedulerFactoryBean 对象来使用 Quartz 调度器。下面是 SchedulerFactoryBean 配置的示例:
```java
@Configuration
public class SchedulerConfig {
@Autowired
private DataSource dataSource;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setDataSource(dataSource); // 设置数据源
schedulerFactoryBean.setAutoStartup(true); // 容器启动时自动开启
schedulerFactoryBean.setOverwriteExistingJobs(true); // 做任务覆盖
schedulerFactoryBean.setSchedulerName("myScheduler"); // 设置调度器名称
return schedulerFactoryBean;
}
}
```
其中,schedulerFactoryBean() 配置方法返回一个 SchedulerFactoryBean 实例。setDataSource() 方法设置数据源,setAutoStartup() 方法启动调度器,默认为 true,setOverwriteExistingJobs() 方法设置任务是否覆盖,默认为 true,setSchedulerName() 方法设置调度器名称。
二、SchedulerFactoryBean 使用方法
SchedulerFactoryBean 提供了多种方式来管理 Quartz 调度器和任务,其中包括添加和删除任务、立即执行任务、暂停/恢复任务、修改任务等。
以下是 SchedulerFactoryBean 的使用方法示例:
1、添加任务
添加一条任务,需要用到两个方法:addTriggerTask 和 createTrigger。
```java
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
@Test
public void scheduleJob() throws Exception {
String id = "myJob";
String group = "myJobGroup";
// 定义 Trigger
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(springJobDetail());
trigger.setCronExpression("0/5 * * * * ?");
schedulerFactoryBean.getScheduler().scheduleJob(springJobDetail().getObject(), trigger.getObject());
schedulerFactoryBean.getScheduler().triggerJob(JobKey.jobKey(id, group));
}
@Bean
public JobDetailFactoryBean springJobDetail() {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass(MyJob.class);
factoryBean.setName("myJob");
factoryBean.setGroup("myJobGroup");
Map map.put("hello", "world"); factoryBean.setJobDataAsMap(map); factoryBean.setDurability(true); // 设置任务持久化 return factoryBean; } public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("execute cron job!"); } } ``` addTriggerTask 和 createTrigger 方法可以在 SchedulerFactoryBean 运行时动态添加任务。 2、修改任务 SchedulerFactoryBean 提供了修改任务的方法,可以修改任务的 Cron 表达式、任务名称、任务分组等属性。 ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; @Test public void modifyJob() throws Exception { String jobName = "testJob"; String groupName = "testJobGroup"; JobKey jobKey = JobKey.jobKey(jobName, groupName); CronTrigger trigger = (CronTrigger) schedulerFactoryBean.getScheduler().getTrigger(new TriggerKey(jobName,groupName)); String oldCat = trigger.getCronExpression(); // 修改 Cron 表达式 trigger.getTriggerBuilder().withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")).build(); schedulerFactoryBean.getScheduler().rescheduleJob(trigger.getKey(), trigger); // 修改 Job 名称和分组 schedulerFactoryBean.getScheduler().triggerJob(jobKey); schedulerFactoryBean.getScheduler().deleteJob(jobKey); schedulerFactoryBean.getScheduler().scheduleJob(springJobDetail().getObject(), trigger); } ``` 3、删除任务 ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; @Test public void testDeleteJob() throws Exception { String id = "myJob"; String group = "myJobGroup"; TriggerKey triggerKey = TriggerKey.triggerKey(id, group); schedulerFactoryBean.getScheduler().pauseTrigger(triggerKey); schedulerFactoryBean.getScheduler().unscheduleJob(triggerKey); JobKey jobKey = JobKey.jobKey(id, group); schedulerFactoryBean.getScheduler().deleteJob(jobKey); } ``` 4、暂停、恢复任务 SchedulerFactoryBean 还包含了暂停和恢复任务的方法,可以方便地管理调度器中的任务。 ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; @Test public void testPauseJob() throws Exception { String id = "myJob"; String group = "myJobGroup"; JobKey jobKey = JobKey.jobKey(id, group); schedulerFactoryBean.getScheduler().pauseJob(jobKey); } ``` ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; @Test public void testResumeJob() throws Exception { String id = "myJob"; String group = "myJobGroup"; JobKey jobKey = JobKey.jobKey(id, group); schedulerFactoryBean.getScheduler().resumeJob(jobKey); } ``` 5、立即执行一次任务 除了周期性地执行任务外,SchedulerFactoryBean 也可以执行一次性的即时任务。 ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; @Test public void testExecuteJob() throws Exception { String id = "myJob"; String group = "myJobGroup"; JobKey jobKey = JobKey.jobKey(id, group); schedulerFactoryBean.getScheduler().triggerJob(jobKey); } ``` 三、SchedulerFactoryBean 案例说明 一个使用了 SchedulerFactoryBean 的示例使用如下代码定义了一个可以定时打印当前时间的任务: ```java /** * 定时任务执行函数 */ public class DemoTask { public void showCurrentTime() { System.out.println("当前时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } } /** * 配置定时任务 */ @Configuration public class TaskConfig { @Autowired private DemoTask demoTask; @Bean public JobDetail demoJobDetail() { return JobBuilder.newJob(DemoTask.class).withIdentity("demoTask").storeDurably().build(); } @Bean public Trigger demoTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) //每5秒执行一次 .repeatForever(); //永久执行 return TriggerBuilder.newTrigger().forJob(demoJobDetail()) //指定要触发的任务 .withIdentity("demoTrigger") //定义标识符 .withSchedule(scheduleBuilder).build(); } @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setJobDetails(demoJobDetail()); // job任务详情数据 schedulerFactoryBean.setTriggers(demoTrigger()); // 触发器 Properties quartzProperties = new Properties(); quartzProperties.setProperty("org.quartz.scheduler.instanceName", "SchedulerFactoryBean"); quartzProperties.setProperty("org.quartz.threadPool.threadCount", "5"); // 线程数 schedulerFactoryBean.setQuartzProperties(quartzProperties); return schedulerFactoryBean; } } ``` 在上面的示例中,DemoTask 继承了 Quartz Job 类,用于打印当前时间的方法在 showCurrentTime 中实现,TaskConfig 类中通过注入 DemoTask 对象实例,并定义了触发器的 detail 数据和 trigger 触发数据。 通过调用 SchedulerFactoryBean 对象的 getScheduler() 方法,我们可以获取到调度器实例,然后通过触发 Bean 的定时方法来执行对应的任务。 总结: 本文详细介绍了 SchedulerFactoryBean 的配置、使用方法和案例说明, SchedulerFactoryBean 可以帮助我们实现定时任务调度,方便地管理 Quartz 调度器和任务,提高了开发效率。通过学习本文,相信读者们对 SchedulerFactoryBean 的使用方法已经有了深入的了解,更好地应用 SchedulerFactoryBean 调度框架,让我们的项目变得更加简洁易维护、高效稳定。 如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复