首页 > 其他分享 >spring boot —— 整合Scheduling定时任务

spring boot —— 整合Scheduling定时任务

时间:2022-12-19 11:32:19浏览次数:59  
标签:Scheduled spring void boot System cron 线程 Scheduling public


Spring 3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支 持注解编程方式。

使用

启用在spring boot 启动类上添加注解: @EnableScheduling 

串行任务

两个任务方法由一个线程串行执行,方法执行完成task2再执行。 

测试代码:


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

/**
* @author LYQ
* @since 2018/12/19 14:55
*/
@Component
public class TestTask {

@Scheduled(fixedRate = 3000)//每隔5秒执行一次
public void task1(){
System.out.println("定时任务测试1");
}
}


参数说明:​​https://www.jianshu.com/p/1defb0f22ed1​

并行任务

多个任务由不同的线程在并行执行,互不影响。


@Configuration
@EnableScheduling
public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer {
//线程池线程数量
private int corePoolSize = 5;

@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();//初始化线程池
scheduler.setPoolSize(corePoolSize);//线程池容量
return scheduler;
}

@Override
public Executor getAsyncExecutor() {
Executor executor = taskScheduler();
return executor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}

@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}


注意:将@EnableScheduling添加到此配置类上,SpringBoot启动类上不用再添加@EnableScheduling 

@Scheduled 参数说明

1. cron

该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。

cron表达式使用占位符


time: cron: */5 * * * * * interval: 5

@Scheduled(cron="${time.cron}")
void testPlaceholder1() {
System.out.println("Execute at " + System.currentTimeMillis());
}

@Scheduled(cron="*/${time.interval} * * * * *")
void testPlaceholder2() {
System.out.println("Execute at " + System.currentTimeMillis());
}


2. zone

时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。

3. fixedDelay

上一次执行完毕时间点之后多长时间再执行。如:


//上一次执行完毕时间点之后10秒再执行 @Scheduled(fixedDelay = 10000)


4. fixedDelayString

与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如:


//上一次执行完毕时间点之后10秒再执行 
@Scheduled(fixedDelayString = "10000")

占位符的使用(配置文件中有配置:time.fixedDelay=10000):

@Scheduled(fixedDelayString = "${time.fixedDelay}")
void testFixedDelayString() {
System.out.println("Execute at " + System.currentTimeMillis());
}


应用
 

注解随机延迟

当有多个节点时不希望它们同时运行。所以我想为初始延迟设置一个随机值,以使它们相互抵消。


import org.springframework.scheduling.annotation.Scheduled; @Scheduled(fixedRate = 600000, initialDelay = <random number between 0 and 10 minutes> )


不幸的是,我在这里只能使用常量表达式。有没有其他方法可以解决这个问题?我想到了使用Spring表达式语言。

可以通过Spring Expression Language配置initialDelay:


@Scheduled(fixedRate = 600000, initialDelayString = "#{ T(java.util.concurrent.ThreadLocalRandom).current().nextInt(10*60*1000) }" )


标签:Scheduled,spring,void,boot,System,cron,线程,Scheduling,public
From: https://blog.51cto.com/u_10176086/5951836

相关文章

  • SpringMVC核心技术
    入门程序Web.xml(前端控制器)配置:        在web.xml中添加DispatcherServlet的配置。         <servlet><servlet-name>springmvc</servlet......
  • 本地搭建bootlin elixir查阅内核代码
    转自:https://barryx.cn/build_bootlin_elixir平时经常使用elixir.bootlin.com查看内核源码,很方便。但是苦于该站点服务器在国外,国内用起来很卡很慢,所以想着自己在本地搭......
  • SpringBoot3.x中spring.factories功能被移除的解决方案
    背景笔者所在项目组在搭建一个全新项目的时候选用了​​SpringBoot3.x​​​,项目中应用了很多​​SpringBoot2.x​​​时代相关的第三方组件例如​​baomidou​​​出品的​......
  • Spring Boot 之 RESRful API 权限控制
    一、为何用RESTfulAPI1.1RESTful是什么?RESTful(RepresentationalStateTransfer)架构风格,是一个Web自身的架构风格,底层主要基于HTTP协议(ps:提出者就是HTTP协议的作者),是分布......
  • Spring的两种任务调度Scheduled和Async
    Spring提供了两种后台任务的方法,分别是:调度任务,@Schedule异步任务,@Async当然,使用这两个是有条件的,需要在spring应用的上下文中声明​​​<task:annotation-driven/>​​​......
  • springboot项目打包报错:Type org.springframework.boot.maven.RepackageMojo not pres
    折磨了好久的一个问题,换过spring-boot-maven-plugin版本,但不见效。今天参考这篇文章:springboot打包RepackageMojonotpresent,版本改成2.6.2,不行。就想,可能是我用的idea......
  • SpringData ES中一些底层原理的分析
    之前写过一篇​​SpringDataES关于字段名和索引中的列名字不一致导致的查询问题​​​,顺便深入学习下SpringDataElasticsearch。 ​​​SpringDataElasticsearch​​......
  • Spring AMQP项目
    SpringAMQP项目将Spring的核心概念应用于基于AMQP的消息传递解决方案的开发。我们提供了一个“模板”作为发送和接收消息的高级抽象。我们还为消息驱动的POJO提供支持......
  • Spring AMQP项目(二)
    4.1.5.发送消息发送消息时,您可以使用以下任一方法:voidsend(Messagemessage)throwsAmqpException;voidsend(StringroutingKey,Messagemessage)throwsAmqpExceptio......
  • Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路
    端口:8888,方便起见直接读取配置文件,生产环境可以读取git。application-dev.properties为全局配置。先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取。consu......