服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Spring Boot 多个定时器冲突问题的解决方法

Spring Boot 多个定时器冲突问题的解决方法

2022-12-24 16:10Java技术栈 Java教程

这篇文章主要介绍了Spring Boot 多个定时器冲突问题的解决方法,实际开发中定时器需要解决多个定时器同时并发的问题,也要解决定时器之间的冲突问题,本文通过问题场景重现给大家介绍的非常详细,需要的朋友参考下吧

战术分析

上次的博客疏忽了定时器的一个大重点…

实际开发项目中一定不止一个定时器,很多场景都需要用到,而多个定时器带来的问题 : 就是如何避免多个定时器的互相冲突。

推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice

 

使用场景

我们的订单服务,一般会有一个待支付订单,而这个待支付订单是有时间限制的,比如阿里巴巴的订单是五天,淘宝订单是一天,拼多多订单是一天,美团订单是15分钟…

基金系统中,如何同时更新多个存储分区中的基金信息…

总的来说,实际开发中定时器需要解决多个定时器同时并发的问题,也要解决定时器之间的冲突问题

问题不大,说到并发那就离不开多线程了…慢慢看看就懂了

 

问题场景重现

Spring Boot 多个定时器冲突问题的解决方法

Spring Boot 多个定时器冲突问题的解决方法

我们清晰的看到执行结果都是scheduling-1

就此可以判定,Springboot定时器默认的是单线程的

但是问题就来了,如果在线程争夺资源后,某个线程需要比较长时间才能执行完,那其他的定时器怎么办,都只能进入等待状态,时间越久,累计等待的定时器越多,这就容易引起雪崩…

其实只需要添加一个配置类然后加注解就可以解决问题了

添加注解

Spring Boot 多个定时器冲突问题的解决方法

具体代码如下 :

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class SchedulerTaskController {
  private Logger logger= LoggerFactory.getLogger(SchedulerTaskController.class);
  private static final SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
  private int count=0;
  @Scheduled(cron="*/6 * * * * ?")
  @Async("threadPoolTaskExecutor")
  public void process(){
      logger.info("英文:this is scheduler task runing "+(count++));
  }
  @Scheduled(fixedRate = 6000)
  @Async("threadPoolTaskExecutor")
  public void currentTime(){
      logger.info("中文:现在时间"+dateFormat.format(new Date()));
  }
}

配置类

Spring Boot 多个定时器冲突问题的解决方法

具体代码如下 :

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要来创建Executors,
* 在使用spring中,已经给我们做了很好的支持。只要要@EnableAsync就可以使用多线程
* 通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池。*/
//@Configuration 表示该类是一个配置类
@Configuration
@EnableAsync
//所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。
public class TaskScheduleConfig {
  private static final int corePoolSize = 10;       		// 默认线程数
  private static final int maxPoolSize = 100;			    // 最大线程数
  private static final int keepAliveTime = 10;			// 允许线程空闲时间(单位:默认为秒),十秒后就把线程关闭
  private static final int queueCapacity = 200;			// 缓冲队列数
  private static final String threadNamePrefix = "it-is-threaddemo-"; // 线程池名前缀
  @Bean("threadPoolTaskExecutor") // bean的名称,默认为首字母小写的方法名
  public ThreadPoolTaskExecutor getDemoThread(){
      ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
      executor.setCorePoolSize(corePoolSize);
      executor.setMaxPoolSize(maxPoolSize);
      executor.setQueueCapacity(keepAliveTime);
      executor.setKeepAliveSeconds(queueCapacity);
      executor.setThreadNamePrefix(threadNamePrefix);
      //线程池拒绝任务的处理策略
      executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
      //初始化
      executor.initialize();
      
      return executor;
  }
}

然后我们可以很清晰地看到:

Spring Boot 多个定时器冲突问题的解决方法

如上,也就解决了用多线程解决Springboot多定时器冲突的问题

到此这篇关于Spring Boot 多个定时器冲突问题的解决方法的文章就介绍到这了,更多相关Spring Boot 定时器冲突内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/javastack/archive/2022/05/25/16308016.html

延伸 · 阅读

精彩推荐
  • Java教程Java 日志打印的15个好建议

    Java 日志打印的15个好建议

    这篇文章主要介绍了Java日志打印的15个好建议,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    jay@huaxiao5092022-01-17
  • Java教程Java LocalCache 本地缓存的实现实例

    Java LocalCache 本地缓存的实现实例

    本篇文章主要介绍了Java LocalCache 本地缓存的实现实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。...

    特立独行的猪手3302020-09-27
  • Java教程Java虚拟机运行时栈的栈帧

    Java虚拟机运行时栈的栈帧

    本节将会介绍一下Java虚拟机栈中的栈帧,会对栈帧的组成部分(局部变量表、操作数栈、动态链接、方法出口)分别进行介绍,最后还会通过javap命令反解...

    没头脑遇到不高兴10082022-01-17
  • Java教程Eclipse+Maven构建Hadoop项目的方法步骤

    Eclipse+Maven构建Hadoop项目的方法步骤

    这篇文章主要介绍了Eclipse+Maven构建Hadoop项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    Eric Chan7002021-07-15
  • Java教程Java如何调用C++ DLL库

    Java如何调用C++ DLL库

    本文重点给大家介绍java中调用c++ dll库的方法,本文分步骤介绍的非常详细,感兴趣的朋友可以参考下 ...

    Joseph_buaa7872020-05-21
  • Java教程java实现置换密码加密解密

    java实现置换密码加密解密

    这篇文章主要为大家详细介绍了java实现置换密码加密解密,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    降妖问问你敢不敢5822021-07-24
  • Java教程详解使用Jenkins部署Spring Boot项目

    详解使用Jenkins部署Spring Boot项目

    这篇文章主要介绍了详解使用Jenkins部署Spring Boot,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    纯洁的微笑9992021-02-04
  • Java教程Java上传文件进度条的实现方法(附demo源码下载)

    Java上传文件进度条的实现方法(附demo源码下载)

    这篇文章主要介绍了Java上传文件进度条的实现方法,可简单实现显示文件上传比特数及进度的功能,并附带demo源码供读者下载参考,需要的朋友可以参考下 ...

    李超@hicc7952020-03-12