Spring Boot中实现定时任务应用实践

以下是关于“Spring Boot中实现定时任务应用实践”的完整攻略。

1. 添加依赖

首先,在pom.xml文件中添加spring-boot-starter-quartz依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2. 配置Quartz

application.properties文件中添加Quartz的配置信息:

# 配置Quartz
spring.quartz.properties.org.quartz.scheduler.instanceName=SpringBootQuartzTask
spring.quartz.properties.org.quartz.scheduler.instanceId=1
spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck=true
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.dataSource=quartzDataSource
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.driverClassName=org.postgresql.Driver
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.URL=jdbc:postgresql://localhost:5432/quartz
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.user=postgres
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.password=passwd
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.maxConnections=10

其中,org.quartz.dataSource.quartzDataSource.URL是Quartz的数据源配置,你可以根据自己的数据库类型进行配置。

3. 定义定时任务

Job类中定义定时任务:

@Component
public class ScheduleTask implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello, Quartz!");
    }
}

其中,@Component注解表示这是一个Spring的组件,用于实现Bean的依赖注入。

4. 配置定时任务

在定时任务配置类中,配置排程任务:

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(ScheduleTask.class) //指定需要执行的任务类
                .storeDurably().build();
    }

    @Bean
    public Trigger trigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10) //每10s执行一次
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(jobDetail())
                .withSchedule(scheduleBuilder).build();
    }

}

jobDetail()方法返回的是JobDetail对象,其中需要指定需要执行的任务类(即ScheduleTask),同时将其设置为持久化存储。trigger()方法返回的是Trigger对象,其中需要指定任务执行的时间间隔。

5. 测试

新建一个Spring Boot项目,并在Application类中添加@EnableScheduling注解启用定时任务功能:

@SpringBootApplication
@EnableScheduling
public class Application {

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

}

最后,运行项目,你会发现Quartz定时任务已经被自动执行,每10秒钟打印一次“Hello, Quartz!”。

示例1

TaskService中添加一个定时任务:

@Service
public class TaskService {

    @Scheduled(cron = "0 0/1 * * * ?")
    public void job() {
        System.out.println("开始执行定时任务: " + LocalDateTime.now());
    }

}

cron表达式中,0 0/1 * * * ?表示每分钟执行一次。

示例2

添加通过@Scheduled注解动态改变定时任务执行时间:

@Service
public class TaskService {

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

    private ScheduledExecutorService service = Executors.newScheduledThreadPool(1);

    // 定时任务句柄,用于修改定时任务执行时间
    private ScheduledFuture<?> future;

    /**
     * 启动定时任务
     *
     * @param rate 时间间隔(单位:秒)
     */
    public void start(int rate) {
        if (future != null) {
            future.cancel(false);
        }
        future = service.scheduleAtFixedRate(() ->
                        logger.info("Hello, Scheduled Task!"),
                0, rate, TimeUnit.SECONDS);
    }

}

start方法中,通过service.scheduleAtFixedRate()方法实现动态改变定时任务执行时间。

以上就是关于“Spring Boot中实现定时任务应用实践”的完整攻略和多个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot中实现定时任务应用实践 - Python技术站

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

相关文章

  • Docker容器使用宿主机上的mongod/redis等服务详解

    下面我将详细讲解“Docker容器使用宿主机上的mongod/redis等服务”的完整攻略。 1. 使用桥接网络和host网络 Docker容器可以使用宿主机上的服务,有两种方式可以实现:使用桥接网络和使用host网络。 1.1 使用桥接网络 Docker默认会为每一个容器创建一个自己的网络。如果在容器内需要访问宿主机上的服务,可以通过将容器加入到宿主机上的…

    database 2023年5月22日
    00
  • 数据库加密字段进行模糊查询详解

    首先,在讲解数据库加密字段模糊查询之前,我们需要知道什么是加密。简单来说,加密就是把普通的数据转化为加密的数据,以达到保护数据安全的目的。 在某些情况下,我们需要对数据库中加密的字段进行模糊查询,这时就需要使用到一些特殊的函数或方法。以下是对数据库加密字段进行模糊查询的详细攻略: 1. 数据库中加密字段模糊查询的基本原理 在数据库中存储加密字段时,加密方法一…

    database 2023年5月22日
    00
  • MYSQL大量写入问题优化详解

    MYSQL大量写入问题优化详解 在MYSQL中进行大量写入操作时,可能会遇到性能瓶颈和效率不高的问题。本文将针对大量写入问题进行优化详解。 问题分析 在MYSQL中,进行大量写入操作时,可能会出现以下问题: 数据库性能瓶颈。对数据库进行大量写入操作时,可能会导致数据库性能瓶颈,导致整个系统的性能下降。 数据丢失。对数据库进行大量写入操作时,可能出现数据丢失的…

    database 2023年5月19日
    00
  • Android性能优化以及数据优化方法

    针对Android性能优化以及数据优化方法,我整理了以下内容: Android性能优化攻略 一、布局优化 减少布局层级,保证尽可能扁平化的布局层级结构。 使用ConstraintLayout布局它可以帮助我们更高效得布局。 使用ListView、RecyclerView等控件时,适当使用缓存技术。 示例1:在一个Android应用中,列表页的性能问题比较严重…

    database 2023年5月19日
    00
  • oracle关键字作为字段名使用方法

    当使用Oracle关键字作为字段名时,需要用双引号将字段名括起来,这样Oracle才能识别为字段名而不是关键字。 下面是使用Oracle关键字作为字段名的示例: 示例1: 假设有一个Oracle表格,表格名为Students,字段包括姓名、年龄等,而其中一个字段名为“SELECT”,则可以按照以下方式进行查询: SELECT "SELECT&quo…

    database 2023年5月21日
    00
  • Linux杀不死的进程之CPU使用率700%解决方法

    以下是关于“Linux杀不死的进程之CPU使用率700%解决方法”的完整攻略: 问题描述 有时候在Linux系统中,我们可能会遇到一些卡死的进程导致CPU使用率飙升,这些进程通常无法通过常规杀进程命令(如kill -9)来终止,这时候该怎么办呢? 解决方法 通过pstree查找父进程并杀掉 首先,我们可以通过pstree命令来查看卡死进程的父进程,然后再对父…

    database 2023年5月22日
    00
  • MySQL数据库简介与基本操作

    MySQL数据库是一个开源的关系型数据库管理系统,是目前最流行的关系型数据库管理系统之一。本文将为大家详细讲解MySQL数据库的简介与基本操作,帮助用户快速掌握MySQL的基本用法。 MySQL数据库简介 MySQL数据库最初由瑞典的MySQL AB公司开发,现在是Oracle公司旗下的产品。它是一款开源的、跨平台的、关系型数据管理系统,被广泛地应用于Web…

    database 2023年5月19日
    00
  • MySql查询某个时间段内的数据实例(前一周、前三个月、前一年等)

    MySQL是常用的关系型数据库,在数据的查询上面,它提供了丰富的语法和函数。下面就详细讲解MySQL查询某个时间段内的数据实例。 查询前一周的数据 查询前一周的数据,可以使用MySQL的DATE_SUB函数,如下例所示: SELECT * FROM table_name WHERE date_column BETWEEN DATE_SUB(CURDATE()…

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