SchedulerFactoryBean配置

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。

```

org.springframework.boot

spring-boot-starter-quartz

```

在 Spring Boot 1.x 版本中,则需要添加 spring-context-support、spring-tasks 和 quartz 三个依赖。

```

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-tasks

${spring.version}

org.quartz-scheduler

quartz

${quartz.version}

```

需要注意的是,上述依赖中的 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 = new HashMap<>();

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/

点赞(18) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部