热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot2.x学习笔记——定时任务使用与持久化

SpringBoot2.x学习笔记——

定时任务实现概述

    定时任务是企业级开发中最常见的功能之一,如定时统计订单数、定时同步数据、定时发送短信和邮件。简单执行的定时任务可以通过@Scheduled实现,复杂的定时任务可以通过Quartz来实现。

    Scheduled

       @Scheduled是由Spring提供的定时任务注解,使用方便,配置简单。在使用定时任务执行某项操作(发送邮件、同步数据),不考虑定时任务调度持久化时使用。

    Quartz

   Quartz是一个功能丰富的开源作业调度库,使用Java编写,可以在Java应用程序中集成使用。使用Quartz可以创建简单或复杂的执行计划,支持持久化、集群、cron表达式等,具有极高的灵活性。

   在与SpringBoot2.x整合的过程中,主要提供三个Bean:JobDetail、Trigger、SchedulerFactory。

  • JobDetail:用来保存Job的详细信息(Job名称、Job描述、关联监听器等)。一个JobDetail可以有多个Trigger,一个Trigger对应一个JobDetail。

  • Trigger:描述触发定时任务的执行规则。主要有SimpleTrigger和CronTrigger两个子类。SimpleTrigger适用于触发一次或以固定间隔周期执行;CronTrigger可以通过Cron表达式定义各种复杂规则时间调度方案。

  • Scheduler:负责管理Quartz运行环境。Trigger和JobDetail都可以注册到Scheduler中。Scheduler可以将Trigger绑定到一个JobDetail中,当Trigger触发时,对应的Job会自动执行。Scheduler拥有一个SchedulerContext,保存着Scheduler上下文信息,JobDetail和Trigger都可以访问Scheduler上下文信息。

  定时任务使用示例

    Scheduled使用示例

    引入依赖

    

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>

    编写定时任务

    

package com.springboot.demo.scheduled;


import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


import java.util.Date;


@Component
public class ScheduledDemo {
@Scheduled(fixedDelay = 1000)
public void fixedDelay()
{
System.out.println("fixedDelay:"+new Date());
}
@Scheduled(fixedRate=2000)
public void fixedRate()
{
System.out.println("fixedRate:"+new Date());
}
@Scheduled(initialDelay = 1000,fixedRate = 2000)
public void initialDelay()
{
System.out.println("initialDelay:"+new Date());
}
@Scheduled(cron = "0 * * * * ?")
public void cron()
{
System.out.println("cron---------"+new Date());
}
}


    @Scheduled用于标注一个定时任务,参数定义及作用如下

    

参数名称参数作用
fixedDelay定时任务执行完成后开始计时
fixedRate
定时任务开始执行时开始计时
initialDelay首次执行定时任务延时时间
croncron表达式

    cron表达式详解

    cron表达式完整字段如下:[秒][分][小时][日][月][周][年]

    

字段值区间
允许特殊字符
0-59,-*/
0-59,-*/
小时
0-23,-*/
1-31
,-*?/LWC

1-12或JAN-DEC
,-*/

1-7或SUN-SAT
,-*?/LC#

留空或1970-2099
,-*/

    特殊字符含义如下

特殊字符含义
,用于表示多个值间隔,每个值均会执行定时任务
-用于表示区间,区间内所有值均会执行定时任务
*表示所有值。设置在秒字段表示每秒执行定时任务

不指定值。不关心当前设置的值,用于日期和周重复现象
/
表示递增触发。如分字段设置为0/15表示从0分钟开始,每隔15分钟触发定时任务执行
L表示最后的意思。日上设置表示最后一天,周上设置表示最后一周。前面加数字,如周设置为6L,表示最后一个周五
W
离指定日期最近的工作日触发
#

用于设置每个月第几个周几,1#3每个月第三个周日

C
Calendar,计划所关联之后的第一天,日上设置为5C,代表每月5号后的第一天;周字段上设置5C,代表每周每周四后的第一天

QUARTZ使用示例

    引入依赖

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-quartzartifactId>
dependency>

    定时任务实例

@Component
public class FirstJob {
public void firstJobTest()
{
System.out.println("firstJob-------"+new Date());
}
}


@Component
public class SecondJob extends QuartzJobBean {
private String message;


public void setMessage(String message) {
this.message = message;
}


@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("info------"+message+"--------"+new Date());
}
}

   定时任务可以是一个普通的JavaBean,也可以是QuartzJobBean子类。继承自QuartzJobBean需要实现executeInternal方法,该方法用于在定时任务执行时被调用。

    定时任务配置

@Configuration
public class QuartzConfig {
/**
* 通过 MethodInvokingJobDetailFactoryBean配置JobDetail
* @return JobBean
*/
@Bean
MethodInvokingJobDetailFactoryBean getFirstJobDetail()
{
MethodInvokingJobDetailFactoryBean firstJobBean=new MethodInvokingJobDetailFactoryBean();
firstJobBean.setTargetBeanName("firstJob");
firstJobBean.setTargetMethod("firstJobTest");
return firstJobBean;
}
@Bean
JobDetailFactoryBean getSecondJobDetail()
{
JobDetailFactoryBean secOndJob=new JobDetailFactoryBean();
secondJob.setJobClass(SecondJob.class);
//设置参数
JobDataMap dataMap=new JobDataMap();
dataMap.put("message","quartzJobInfo");
secondJob.setJobDataMap(dataMap);
        secondJob.setDurability(true);
return secondJob;
}


/**
* 简易触发器
* @return 简易触发器实例
*/
@Bean
SimpleTriggerFactoryBean getSimpleTrigger()
{
//初始化简易触发器
SimpleTriggerFactoryBean simpleTriggerBean=new SimpleTriggerFactoryBean();
//为触发器绑定定时任务
simpleTriggerBean.setJobDetail(getFirstJobDetail().getObject());
//设置定时任务执行次数
simpleTriggerBean.setRepeatCount(3);
//定时任务初始化执行延迟时间
simpleTriggerBean.setStartDelay(1000);
//定时任务执行时间间隔
simpleTriggerBean.setRepeatInterval(2000);
return simpleTriggerBean;
}


/**
* Crom表达式触发器
* @return cron表达式触发器实例
*/
@Bean
CronTriggerFactoryBean getCronTrigger()
{
//初始化Cron表达式触发器
CronTriggerFactoryBean crOnTrigger=new CronTriggerFactoryBean();
//触发器绑定定时任务
cronTrigger.setJobDetail(getSecondJobDetail().getObject());
//设置cron表达式
cronTrigger.setCronExpression("0 * * * * ? ");
return cronTrigger;
}


/**
* 创建定时任务工厂并设置触发器
* @return 定时任务工厂
*/
@Bean
SchedulerFactoryBean getSchedulerFactory()
{
//初始化定时任务工厂实例
SchedulerFactoryBean schedulerFactory=new SchedulerFactoryBean();
//获取绑定定时任务后的触发器
SimpleTrigger simpleTrigger=getSimpleTrigger().getObject();
CronTrigger crOnTrigger=getCronTrigger().getObject();
//为定时任务工厂设置触发器
schedulerFactory.setTriggers(simpleTrigger,cronTrigger);
//返回定时任务工厂
return schedulerFactory;
}


}

    JobDetail的实例化有两种方式

  • 通过MethodInvokingJobDetailFactoryBean实例化JobDetail,分别设置需要执行的JobDetail实例名(setTargetBeanName)和实例方法(setTargerMethod)就可以实例化JobDetail,无法为该JobDetail实例设置参数

  • 通过JobDetailFactoryBean实例化JobDetail。需要指定JobDetail类名(setJobClass(Class)),并通过JobDataMap实例为该JobDetail设置参数(dataMap.put(propertyName,value);)

    Quartz包含了多种触发器,这里只展示简易触发器(SimpleTrigger)和Cron表达式触发器(CronTrigger)。

  • 简易触发器(SimpleTrigger)。在简易触发器中,首先需要为触发器绑定定时任务实例(simpleTriggerBean.setJobDetail()),然后设置定时任务执行次数( simpleTriggerBean.setRepeatCount())、定时任务首次执行延迟时间(simpleTriggerBean.setStartDelay())、定时任务执行间隔时间(simpleTriggerBean.setRepeatInterval())。

  • Cron表达式触发器(CronTrigger)。在Cron表达式触发器中,首先需要为触发器绑定定时任务实例(cronTrigger.setJobDetail()),然后设置cron表达式(cronTrigger.setCronExpression(""))。

    最后通过SchedulerFactoryBean创建实例,并设置对应的触发器即可。

  主程序入口



@EnableScheduling
public class DemoApplication {


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


}




推荐阅读
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
萝莉控的小潴_515
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有