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/zh-hant/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

發表回復

登錄後才能評論