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实现希尔排序算法

    下面我就详细讲解一下“Java实现希尔排序算法”的攻略。 什么是希尔排序 希尔排序是插入排序的一种高效实现,也称为缩小增量排序。其基本思路是将待排序的元素分为若干组,对每组元素使用插入排序算法进行排序。然后逐渐减少元素分组的间隔,重复上述过程,直到元素之间间隔为1,获得最终的排序结果。 实现希尔排序的Java代码 下面是一个基于Java的希尔排序算法实现: …

    Java 2023年5月26日
    00
  • myeclipse中使用maven前常见错误及解决办法

    下面我将为您讲解“myeclipse中使用maven前常见错误及解决办法”的完整攻略。 一、MyEclipse中使用Maven的常见错误 找不到Maven依赖项 当使用Maven在MyEclipse中创建项目时,有时会遇到“找不到Maven依赖项”的错误。这可能是由于MyEclipse没有正确配置Maven的路径或者Maven本身存在问题。 无法从Maven…

    Java 2023年5月20日
    00
  • 布隆过滤器(Bloom Filter)的Java实现方法

    布隆过滤器(Bloom Filter)的Java实现方法 什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种数据结构,它可以用来判断一个元素是否可能存在于一个集合中,但并不能确定该元素是否一定存在于该集合中。因为该数据结构的判断结果在误判率(False Positive Rate)上具有一定的不确定性。布隆过滤器可以在空间和时间上做到非常高效,…

    Java 2023年5月26日
    00
  • java 非常好用的反射框架Reflections介绍

    Java 反射框架 Reflections 介绍 什么是 Reflections Reflections 是一个非常好用的 Java 反射框架,可以用于查找和获取 Java 类中的注解、方法、属性等信息。通过 Reflections 可以方便地实现自动化扫描和创建组件、注册 Bean 等功能。 Reflections 的使用方法 使用 Reflections…

    Java 2023年5月26日
    00
  • Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

    下面我来详细讲解一下在Spring Boot中如何使用jdbctemplate操作MySQL数据库的方法。 准备工作 首先,我们需要在pom.xml文件中将以下依赖项添加到项目中: <dependency> <groupId>org.springframework.boot</groupId> <artifactId…

    Java 2023年6月16日
    00
  • Java编程swing组件JLabel详解以及使用示例

    Java编程swing组件JLabel详解以及使用示例 什么是JLabel? JLabel是Java Swing组件库中的一个组件,用于在GUI应用程序中显示文本或图像。它可以用于标识其他组件的含义,显示应用程序状态或显示与应用程序相关的其他信息。 如何在Java编程中使用JLabel? 创建JLabel 创建JLabel非常简单,只需要实例化该类即可。以下…

    Java 2023年5月20日
    00
  • Java数组的定义、初始化、及二维数组用法分析

    下面我来详细讲解一下Java数组的定义、初始化、及二维数组用法分析的完整攻略。 Java数组的定义 Java数组是由相同类型元素构成的集合,它是一个固定长度的容器,一旦创建后就不能改变其长度,因此Java数组也称为静态数组。在Java中,数组可以存储数值、字符、对象等信息。 Java数组的定义语法如下: 数据类型[] 数组名 = new 数据类型[数组长度]…

    Java 2023年5月26日
    00
  • 简单谈谈Java中的栈和堆

    让我来详细讲解一下Java中的栈和堆。 栈和堆的概念 Java中的栈和堆是内存分配的两种方式,它们持有程序的数据。 栈是一种数据结构,是一块连续的内存空间,存储程序的方法调用以及局部变量等临时数据。栈内存在程序执行完毕后自动释放,因此不需要手动管理内存,更不需要垃圾回收。栈是由操作系统自动进行分配和释放的,是一种高效的数据结构。 堆是另一种数据结构,是Jav…

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