Spring Boot集成Quartz注入Spring管理的类的方法

下面详细讲解如何使用Spring Boot集成Quartz并注入Spring管理的类。

准备工作

首先,我们需要引入相关依赖。在 pom.xml 中加入以下依赖:

<!-- Quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>
<!-- Quartz-Scheduler integration with Spring -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>

配置Quartz

在 Spring Boot 中,我们可以使用 @Configuration 注解来配置 Quartz,并使用 QuartzJobBean 接口实现我们的任务。

@Configuration
public class QuartzConfig {

    /**
     * 配置定时任务
     */
    @Bean
    public JobDetail sampleJobDetail() {
        return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")
                .usingJobData("name", "world").storeDurably().build();
    }

    /**
     * 配置触发器
     */
    @Bean
    public Trigger sampleJobTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10).repeatForever();

        return TriggerBuilder.newTrigger().forJob(sampleJobDetail())
                .withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();
    }

    /**
     * 配置定时任务管理器
     */
    @Bean
    public SchedulerFactoryBean schedulerFactory(ApplicationContext applicationContext,
                                                  JobFactory jobFactory) throws IOException {

        SchedulerFactoryBean factory = new SchedulerFactoryBean();

        // 全局 Job 监听器
        factory.setGlobalJobListeners(new SampleJobListener());

        // 全局 Trigger 监听器
        factory.setGlobalTriggerListeners(new SampleTriggerListener());

        factory.setJobFactory(jobFactory);

        // 配置 QuartzProperties
        factory.setQuartzProperties(quartzProperties());

        return factory;
    }

    /**
     * 配置 QuartzProperties
     * @throws IOException 
     */
    private Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    /**
     * 配置任务工厂
     */
    @Bean
    public JobFactory jobFactory(ApplicationContext applicationContext) {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

}

在上面的配置中,我们通过 JobDetail 定义了一个名为 sampleJob 的 Quartz 任务,并通过 name 声明了一个任务参数。接着,我们通过 Trigger 配置了任务触发器,每隔 10 秒钟触发一次。

最后,我们通过 SchedulerFactoryBean 配置了定时任务管理器,注入了一个自定义的 JobFactory,它用于将任务对象注入到 Spring 容器中,并配置了一个全局的 Job 监听器和 Trigger 监听器。

在上述配置中,我们引用了一个 AutowiringSpringBeanJobFactory 类,这是一个用于将 Quartz 中的 Job 类注入到 Spring 容器中的类。我们需要自己实现这个类:

public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
        ApplicationContextAware {

    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

编写任务类

在我们的任务类中,我们首先需要实现 Quartz 中的 Job 接口,并注入我们的 Spring Bean,实现任务逻辑。

public class SampleJob implements Job {

    private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);

    @Autowired
    private SampleService sampleService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.info("Running SampleJob...");
        logger.info("Hello " + context.getJobDetail().getJobDataMap().getString("name"));
        sampleService.run();
    }
}

在上面的任务类中,我们通过 @Autowired 注解将 SampleService 注入到了正在运行的任务中。

@Service
public class SampleService {

    private static final Logger logger = LoggerFactory.getLogger(SampleService.class);

    public void run() {
        logger.info("Running SampleService...");
    }

}

上面的代码演示了如何在 Quartz 任务中注入 Spring Bean,并通过 Spring 框架执行任务逻辑。

示例

接下来,我们演示如何使用上述配置和任务类,实现定时任务。

Servlet 容器部署

如果你是使用 Servlet 容器部署的 Spring Boot 应用,在 application.properties 中配置以下属性:

# 配置定时任务触发频率(此处配置的是 5 分钟触发一次)
spring.quartz.properties.org.quartz.jobStore.isClustered = false
spring.quartz.properties.org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
spring.quartz.properties.org.quartz.threadPool.threadCount=3
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=600000
spring.quartz.properties.org.quartz.jobStore.acquireTriggersWithinLock=true
spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.job-store-type=memory
spring.quartz.job-store-type='quartz'
spring.quartz.properties.org.quartz.scheduler.instanceName = MyScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO
spring.task.scheduling.pool.size=3

单独运行

如果你是使用单独运行的 Spring Boot 应用,程序启动后会执行定时任务,例如:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    CommandLineRunner demoRunner(SchedulerFactoryBean schedulerFactory) {
        return new CommandLineRunner() {
            @Override
            public void run(String... args) throws Exception {
                Scheduler scheduler = schedulerFactory.getScheduler();
                scheduler.scheduleJob(sampleJobDetail(), sampleJobTrigger());
                scheduler.start();
            }
        };
    }

}

在上面的代码中,我们通过 CommandLineRunner 将我们的任务注入到 Spring 容器中,并构建定时任务。

小结

通过本文,我们了解了如何使用 Spring Boot 集成 Quartz 并注入 Spring 管理的类,实现定时任务的自动配置。同时,我们也提供了在 Servlet 容器部署和单独运行中,如何使用该配置的两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot集成Quartz注入Spring管理的类的方法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Java实体类(entity)作用说明

    首先来讲解一下什么是Java实体类。 Java实体类(Entity)作用说明 Java实体类是一种Java类,用于表示业务模型中的数据对象。在Java开发中,除了程序中使用的基本类型和预定义类型外,一般会自定义一些类用于表示具体的数据对象,比如用户、订单等。此时需要使用Java实体类来对数据进行结构化描述和封装。Java实体类通常包含了字段和相应的get/s…

    Java 2023年5月26日
    00
  • 用javascript制作qq注册动态页面

    下面是用 JavaScript 制作 QQ 注册动态页面的攻略: 1. 前置知识 在进行动态页面制作前,需要掌握以下一些前置知识: HTML:前端页面标记语言,用于编写网页基本结构和内容; CSS:前端页面样式表语言,用于美化网页界面; JavaScript:前端脚本语言,用于实现网页交互和动画效果; DOM:文档对象模型,即用 JavaScript 操作页…

    Java 2023年6月15日
    00
  • java快速生成数据库文档详情

    下面我将为你详细讲解“java快速生成数据库文档详情”的完整攻略。 1. 环境准备 首先,我们需要安装Java开发环境,JDK和JRE都需要安装。然后,我们需要下载并安装MySQL数据库。 2. 导入数据库表结构 将需要生成文档的数据库表结构信息导出为.sql文件,然后使用MySQL命令行工具或可视化工具导入到本地MySQL数据库中。 mysql -u ro…

    Java 2023年5月19日
    00
  • MATLAB算法技巧和实现斐波那契数列的解决思路

    MATLAB算法技巧和实现斐波那契数列的解决思路 概述 MATLAB是一款广泛使用的科学计算软件,其中涉及的算法技巧和实现方法是使用MATLAB进行数据分析和模拟的重点内容之一。这篇文章主要介绍MATLAB中应用于算法优化和实现的技巧和思路,并且使用其中的技巧和思路实现斐波那契数列。 MATLAB算法优化技巧 MATLAB中涉及的算法可以通过一些技巧和方法进…

    Java 2023年5月19日
    00
  • 微信小程序实现触底加载

    下面是详细讲解“微信小程序实现触底加载”的完整攻略: 一、背景 随着微信小程序的普及,越来越多的开发者开始尝试开发小程序。而在小程序中,常常需要实现触底加载的功能,即当用户滚动到页面底部时,自动加载更多数据。这一功能对于提升用户体验、提高应用性能,非常重要。 二、实现思路 实现触底加载的基本思路如下: 在页面的wxml文件中,使用scroll-view组件,…

    Java 2023年5月23日
    00
  • java(包括springboot)读取resources下文件方式实现

    下面是详细讲解“java(包括springboot)读取resources下文件方式实现”的完整攻略。 1. 背景 在Java中,经常需要读取resources下的文件。resources文件夹通常位于项目的classpath下,可以存放各种类型的文件,如文本文件、配置文件、图片等。这里将对读取resource文件夹下文件的几种常用方法进行讲解。 2. 使用…

    Java 2023年5月19日
    00
  • bootstrap——bootstrapTable实现隐藏列的示例

    当你需要在Bootstrap Table中隐藏列时,可以通过以下步骤实现: 第一步:下载Bootstrap Table 首先,需要从Bootstrap Table官网下载Bootstrap Table插件。 官网链接:https://bootstrap-table.com/ 第二步:编写HTML代码 在编写HTML代码之前,需要加载Bootstrap样式表和…

    Java 2023年6月15日
    00
  • Java时间戳类Instant的使用详解

    Java时间戳类Instant的使用详解 简介 Java时间戳类Instant是从Java 8版本开始的新特性,用于表示时间戳,与Java中的Date类相似。它提供了可靠的方法来处理时间戳和与时区的转换,是在处理时间数据时不可或缺的类。 Instant的创建 要创建一个新的Instant对象,我们可以使用现有的运行时间来得到一个时间戳,也可以使用静态方法of…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部