SpringBoot定时器详解

SpringBoot作为现在最流行的Java Web框架之一,提供了一个简单、快捷、灵活的方式来添加定时任务。本文将会从多个方面来对SpringBoot定时器作详细的介绍,包括以下几个方面:

一、创建定时任务

创建一个定时任务只需要一个简单的注解即可。首先在你的主类上添加注解@EnableScheduling启用Spring的计划任务,然后创建一个带有@Scheduled注解的方法即可。例如:

    
    @SpringBootApplication
    @EnableScheduling
    public class DemoApplication {
    
        @Scheduled(cron = "0 0 1 * * ?")
        public void task() {
            // handle task
        }
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

上述代码创建了一个名为task()的任务,它将在每天1点执行。可以通过配置不同的cron表达式来定制不同的执行频率。

二、并行执行与同步执行

默认情况下,SpringBoot的任务是同步执行的,这意味着一个任务将会在上一个任务完成之后才会执行。如果想要并行执行任务需要在方法上添加@Async注解:

    
    @Scheduled(fixedDelay = 1000)
    @Async
    public void task() {
        // handle task
        System.out.println(Thread.currentThread().getName() + " 执行完成!");
    }
    

上述代码将定时任务进行并行化,任务将会异步执行,并且@Async注解要和@Configuration、@EnableAsync注解一起使用。

三、使用线程池

大型应用中应该使用线程池来执行任务,而不是每次都新建一个线程。使用线程池可以提高任务的处理速度,并且能够更好的管理资源。

下面是使用线程池的一个例子:

    
    @Configuration
    @EnableScheduling
    public class ScheduleConfig implements SchedulingConfigurer {
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
            threadPoolTaskScheduler.setPoolSize(10);
            threadPoolTaskScheduler.initialize();
            taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
        }
    
        @Scheduled(fixedDelay = 1000)
        public void task() {
            //handle task
        }
    }
    

通过实现SchedulingConfigurer接口,可以配置使用线程池进行任务定时处理。ThreadPoolTaskScheduler是Spring提供的一种基于线程池的TaskScheduler,它可以设置线程数量、队列容量等参数。

四、使用Spring自带的定时任务组件

Spring Boot除了提供了自带的@Scheduled注解,还提供了自带的定时任务组件——ScheduledExecutorService,它提供了更加复杂的定时任务控制。以下是使用自带的定时任务组件的一个例子:

    
    @Configuration
    @EnableAsync
    public class ScheduleConfig {
        
        private static final ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(5);
    
        public static ScheduledExecutorService getExecutorService() {
            return executorService;
        }
    
        @Bean
        public TaskExecutor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(4);
            executor.setMaxPoolSize(8);
            executor.setQueueCapacity(10000);
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }
    }
    

上述代码创建了一个包含5个线程的ScheduledExecutorService线程池,并使用@Bean注解在SpringBoot中创建了一个TaskExecutor对象。需要注意到的是,为了支持异步调用,这里使用了@EnableAsync注解。

五、使用第三方定时任务组件

Spring Boot并不能解决所有的定时任务问题,有时候需要考虑使用第三方的定时任务组件来达到更好的定时任务控制。以下是使用Quartz定时任务组件的一个例子:

    
    @Configuration
    public class ScheduleConfig {
    
        @Bean(name = "jobDetail")
        public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduleTask task) {// ScheduleTask为需要执行的任务
            MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
            /* 是否并发执行 */
            jobDetail.setConcurrent(false);
            /* 设置任务的名字 */
            jobDetail.setName("srd-11111");
            /* 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用 */
            jobDetail.setGroup("srd");
            /*
             * 为需要执行的实体类对应的对象
             */
            jobDetail.setTargetObject(task);
            /*
             * srd()方法为需要执行的方法 这个方法是要反复执行的
             */
            jobDetail.setTargetMethod("srd");
            return jobDetail;
        }
    
        @Bean(name = "jobTrigger")
        public SimpleTriggerFactoryBean simpleTriggerFactoryBean(@Qualifier("jobDetail") MethodInvokingJobDetailFactoryBean jobDetail) {
            SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
            factoryBean.setJobDetail(jobDetail.getObject());
            /* 设置触发时间 */
            factoryBean.setStartDelay(0);// 设置执行周期
            factoryBean.setRepeatInterval(10000);
            factoryBean.setRepeatCount(100);
            return factoryBean;
        }
    
        @Bean(name = "scheduler")
        public SchedulerFactoryBean schedulerFactory(@Qualifier("jobTrigger") Trigger cronJobTrigger) {
            SchedulerFactoryBean bean = new SchedulerFactoryBean();
            /* 用于quartz集群,QuartzScheduler 启动时更新己存在的Job */
            bean.setOverwriteExistingJobs(true);
            /* 延时启动,应用启动1秒后 */
            bean.setStartupDelay(1);
            /* 注册触发器 */
            bean.setTriggers(cronJobTrigger);
            return bean;
        }
    }
    

上述代码创建了一个Quartz定时任务组件,并且使用@Bean注解注册了需要执行的任务、任务的触发器和任务组件本身。

总结

本文从创建定时任务、并行执行与同步执行、使用线程池、使用Spring自带的定时任务组件和使用第三方定时任务组件这几个方面详细的介绍了SpringBoot定时器的使用方法,希望这篇文章对你有所帮助。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/259428.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-15 16:29
下一篇 2024-12-15 16:29

相关推荐

  • 从ga角度解读springboot

    springboot作为目前广受欢迎的Java开发框架,其中的ga机制在整个开发过程中起着至关重要的作用。 一、ga是什么 ga即Group Artifacts的缩写,它是Mave…

    编程 2025-04-29
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • SpringBoot如何设置不输出Info日志

    本篇文章将带您了解如何在SpringBoot项目中关闭Info级别日志输出。 一、为什么要关闭Info日志 在开发中,我们经常会使用Log4j、Logback等框架来输出日志信息,…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论