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 容器部署和单独运行中,如何使用该配置的两个示例。

阅读剩余 77%

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

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

相关文章

  • Tomcat 实现WebSocket详细介绍

    Tomcat 实现WebSocket详细介绍 什么是WebSocket? WebSocket是HTML5中的一个协议,它的目标是在Web浏览器和服务器之间建立实时、双向的通信会话,以便实现更好的实时性和降低通信量。以前,为了实现实时通信,使用一些技术如Ajax、Comet等技术,但它们都存在着一些问题,而WebSocket协议能够有效地解决这些问题,因此得到…

    Java 2023年5月19日
    00
  • Spring+Hibernate+Struts(SSH)框架整合实战

    Spring+Hibernate+Struts(SSH)框架整合实战 SSH框架整合是Java Web开发中常用的一种方式,它将Spring、Hibernate和Struts三个框架整合在一起,形成了一个完整的Web应用程序。在本文中,我们将详细讲解如何使用SSH框架整合开发Web应用程序,并提供两个示例来说明如何使用SSH框架整合开发Web应用程序。 环境…

    Java 2023年5月18日
    00
  • SpringBoot使用Caffeine实现缓存的示例代码

    下面给出 SpringBoot 使用 Caffeine 实现缓存的示例代码的完整攻略。 1. 添加 Caffeine 依赖 在 pom.xml 文件中添加 Caffeine 依赖: <!–Caffeine–> <dependency> <groupId>com.github.ben-manes.caffeine<…

    Java 2023年5月19日
    00
  • MySQL5.5版本安装与安装失败详细讲解

    下面我将为你详细讲解“MySQL5.5版本安装与安装失败详细讲解”的完整攻略。 准备工作 首先,我们需要先下载MySQL5.5的安装包。在官网的下载页面,选择相应的操作系统和版本,下载对应的安装包。然后,我们需要安装Visual C++ 2010 Redistributable Package,如果已经安装了就可以跳过这一步。 安装过程 双击MySQL安装包…

    Java 2023年6月1日
    00
  • Spring Boot(二)之web综合开发

    Spring Boot(二)之web综合开发 在本篇文章中,我们将介绍如何使用Spring Boot进行Web开发的综合性攻略。具体来说,将包含以下内容: Spring Boot中MVC的概念以及使用方法; 整合Thymeleaf和Bootstrap实现前端页面渲染; 利用Spring Boot提供的数据持久化机制与数据库进行交互; Spring Boot中…

    Java 2023年6月15日
    00
  • 一文详解Springboot集成mybatis-plus

    下面我将详细讲解“一文详解Springboot集成mybatis-plus”的完整攻略,过程中将包含两条示例。 一、前言 Springboot集成mybatis-plus是一个非常常见的技术选型,它能够帮助我们快速地构建出一个高效且易于维护的项目。在本文中,我将详细讲解Springboot集成mybatis-plus的完整攻略以及过程。 二、准备工作 在开始…

    Java 2023年5月19日
    00
  • Java面向对象之继承的概念详解

    Java面向对象之继承的概念详解 继承是面向对象编程的三大特性之一,也是Java程序设计中重要的概念之一。继承允许我们在已有类的基础上定义新的类,新的类可以继承父类的属性和方法,同时可以添加自己的属性和方法。 继承的定义和基本语法 继承(inheritance)是OO(面向对象)技术的一个基本概念,它是从已有类中派生出新的类,新的类可以拥有父类的属性和方法,…

    Java 2023年5月26日
    00
  • kafka消费不到数据的排查过程

    当Kafka的消费者不能消费数据时,我们需要按以下步骤排查故障: 1. 检查主题和分区 首先,确保您有访问消费者订阅的主题和分区的权限。您可以使用以下命令来验证消费者是否订阅了正确的主题和分区: $ bin/kafka-consumer-groups.sh –bootstrap-server localhost:9092 –describe –grou…

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