首页 > 其他分享 >SpringBoot中定时任务多线程任务

SpringBoot中定时任务多线程任务

时间:2023-06-01 18:02:24浏览次数:46  
标签:多线程 SpringBoot sdf cron 任务 new 执行 public


Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下。

开启缓存注解

@SpringBootApplication
 @EnableScheduling //开启定时任务
 public class Application {
  
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
     }
 }



编写定时任务

@Component
 public class ScheduledTasks {
  
     private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
  
 // cron接受cron表达式,根据cron表达式确定定时规则
    @Scheduled(cron="0/5 * * * * ? ")   //每5秒执行一次 
     public void testCron() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
         logger.info(sdf.format(new Date())+"*********每5秒执行一次");
     }
 }


任务完成
启动项目,查看控制台打印信息,发现定时任务已经生效。spring boot 和Scheduled整合完毕。

存在问题
但是后来发现个问题,通过同时测试几个任务发现,所有的任务都是在同一个线程池中的同一个线程来完成的。在实际开发过程中,我们当然不希望所有的任务都运行在一个线程中。

@Scheduled(cron="0/1 * * * * ? ")   //每1秒执行一次 
     public void testCron1() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
         logger.info(sdf.format(new Date())+"*********每1秒执行一次");
     }
    
    @Scheduled(cron="0/2 * * * * ? ")   //每2秒执行一次 
     public void testCron2() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
         logger.info(sdf.format(new Date())+"*********每2秒执行一次");
     }
    
    @Scheduled(cron="0/3 * * * * ? ")   //每3秒执行一次 
     public void testCron3() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
         logger.info(sdf.format(new Date())+"*********每3秒执行一次");
     }
    
    @Scheduled(cron="0/4 * * * * ? ")   //每4秒执行一次 
     public void testCron4() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
         logger.info(sdf.format(new Date())+"*********每4秒执行一次");
     }


 

解决方案
那么,怎么设计成多线程实现并发呢?在网上看到过这样的解决方案。通过ScheduleConfig配置文件实现SchedulingConfigurer接口,并重写setSchedulerfang方法,我们尝试着配置了一下。

@Configuration
 public class ScheduleConfig implements SchedulingConfigurer {
     @Override
     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
         
         taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
     }
 }

如果在Application中不添加@EnableScheduling //开启定时任务,可以在ScheduleConfig中添加@EnableScheduling

整合成功
这样就完成了多线程并发的配置?我们启动项目通过控制台输出信息验证一下结果,最后发现所有的任务都在同一个线程池但不同线程中完成,说明这个方案完全可行,这样,我们就完成了spring boot 多线程并发定时任务。


@Scheduled所支持的参数:

1.cron:cron表达式,指定任务在特定时间执行;
2.fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
3.fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
4.fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
5.fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
6.initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
7.initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
8.zone:时区,默认为当前时区,一般没有用到。

Cron表达式范例:

每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
--------------------- 
参考地址:

spring-boot | 多线程并发定时任务

标签:多线程,SpringBoot,sdf,cron,任务,new,执行,public
From: https://blog.51cto.com/u_16147772/6397251

相关文章

  • 多线程
    多线程线程简介多任务程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。进程:是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。线程:进程中包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和......
  • Linux进程管理、计划任务笔记
    一、Linux进程管理1.1、进程概念进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。并发程序和顺序程序有本质上的差别,为了能更好地描述程序的并发执行,实现操作系统的并发性和共享性,引入“进程”的概念。进程是具有一定独立......
  • SpringBoot项目中实现读写分离
    背景介绍面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极......
  • 前后端分离的架构,前端使用Vue2.6.10,后端使用SpringBoot2.0.0的ERP实现
    技术架构技术框架:SpringBoot2.0.0+Mybatis1.3.2+SLF4J1.7+Vue2.6.10+Ant-Design-Vue1.5.2+Mysql5.7+Redis运行环境:jdk8+IntelliJIDEA+maven+宝塔面板本地部署:1.小皮面板创建一个数据库,导入jsh_erp.sql文件至数据库中,该文件在后端程序的docs文件夹下。2.使用......
  • .net core Abp定时任务实现
     publicclassUseTimeJob:Job//重点是继承Job {publicreadonlyIUserCourseJobTimeService_userCourseJobTimeService;publicreadonlyIOrganizationAppService_organizationAppService;privatereadonlyIOfflineCourseLiveRecordServic......
  • Springboot实现ENC加密jasypt-spring-boot-starter
    依赖:<!--配置文件加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version>&l......
  • ES 内存使用和GC指标——主节点每30秒会去检查其他节点的状态,如果任何节点的垃圾回收
    内存使用和GC指标在运行Elasticsearch时,内存是您要密切监控的关键资源之一。Elasticsearch和Lucene以两种方式利用节点上的所有可用RAM:JVMheap和文件系统缓存。Elasticsearch运行在Java虚拟机(JVM)中,这意味着JVM垃圾回收的持续时间和频率将成为其他重要的监控领域。JVMheap:AGo......
  • python selenium框架解决ip代理框不能自动化登录,解决pyautogui开不了多线程问题
    有时候我们使用python自动化框架的时候,打开一个网页的时候,它会出现出线这一种登录框,我们f12检查不了,用开发者工具强制检查里面没有任何属性.那这时候我们就可以用到python第三方库:pyautoguiPyAutoGUI:是一个Python库,可用于自动化GUI(图形用户界面)程序的任务。它可以让Pytho......
  • .net耗时:多线程分段并发执行与单线程异步执行
    多线程执行存在线程切换的耗时,可采用单线程异步执行。性能根据实际情况调优。结合上面两种情况:可实现多线程异步执行。目前先看看下面两个例子1 多线程分段执行设备查找耗时操作///<summary>///异步查询设备///</summary>///<paramna......
  • AsyncTask 异步任务基本使用-下载视频
    概述android提供了一个异步任务类AsyncTask,使创建异步任务、更新UI变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。本例子将演示并实现,使用AsyncTask来下载视频。详细一、准备工作开发环境:jdk1.8EclipseLunaServiceRelease1(4.4.1)运行环......