国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

SpringBoot3.3 優雅停止/重啟定時任務功能太贊了!

開發 前端
在本文中,我們通過Yaml?屬性配置了自定義線程池,詳細介紹了@Scheduled注解的多種用法,并實現了一個能夠優雅地啟動和停止定時任務的管理系統。

在現代Java應用開發中,定時任務是非常常見的功能。無論是定期備份、數據清理,還是定期發送通知,定時任務都能發揮至關重要的作用。然而,在一個復雜的應用程序中,如何優雅地管理這些定時任務的啟動與停止,尤其是在不影響系統正常運行的情況下,顯得尤為重要。

Spring Boot 提供了強大的任務調度支持,通過@Scheduled注解可以輕松地創建定時任務,并且可以通過配置來靈活地管理這些任務的執行環境。在本文中,我們將深入探討如何通過Yaml屬性配置自定義線程池,并詳細介紹如何使用@Scheduled注解實現多樣化的定時任務。此外,我們還會探討如何優雅地停止和重啟這些任務,確保系統的穩定性和任務的靈活性。

運行效果:

圖片圖片

圖片圖片

若想獲取項目完整代碼以及其他文章的項目源碼,且在代碼編寫時遇到問題需要咨詢交流,歡迎加入下方的知識星球。

項目結構

為了實現我們的目標,我們的項目結構將包含以下部分:

  1. Spring Boot主應用程序:啟動Spring Boot應用,并注冊定時任務。
  2. 定時任務實現:定義定時任務的邏輯。
  3. 任務管理器:提供控制定時任務啟停的方法。
  4. 前端頁面:提供簡潔的前端頁面,允許用戶通過頁面來啟停定時任務。

項目依賴配置(pom.xml)

首先,我們需要在pom.xml文件中添加相關的依賴:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.icoderoad</groupId>
	<artifactId>taskmanager</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>taskmanager</name>
	<description>Demo project for Spring Boot</description>
	
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		
		<!-- Thymeleaf template engine -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
        <!-- Spring Boot Web Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Lombok for reducing boilerplate code -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

配置文件(application.yaml)

在任務調度中,線程池的配置是影響任務執行效率和可靠性的重要因素。默認情況下,Spring Boot 為調度任務提供了一個單線程的執行器,但對于復雜的業務場景,我們往往需要一個更高效的多線程池來管理多個任務的并發執行。通過在application.yaml中配置ThreadPoolTaskScheduler,我們可以自定義線程池的大小以及關閉策略。

接下來,在src/main/resources/application.yaml中添加以下配置:

server:
  port: 8080
  
spring:
  task:
    scheduling:
      pool:
        size: 5  # 配置線程池大小,設為5個線程
      shutdown:
        await-termination: true  # 在應用關閉時等待所有任務完成
        await-termination-period: 30s  # 等待時間設置為30秒

這里我們設置了一個調度池,并配置了任務關閉時的等待策略,以確保任務能夠優雅停止。

創建 TaskSchedulerProperties 配置類

創建一個配置類來綁定 application.yml 中的屬性:

package com.icoderoad.taskmanager.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Data;

@Data
@Component
@ConfigurationProperties(prefix = "spring.task.scheduling.pool")
public class TaskSchedulerProperties {

    private int size;

}

定時任務的實現

@Scheduled 注解的詳細用法

@Scheduled注解是Spring中的一個強大工具,用于定義各種類型的定時任務。它支持多種觸發方式,包括固定速率(fixedRate)、固定延遲(fixedDelay)、和Cron表達式等,能夠滿足幾乎所有常見的定時任務需求。

  1. 固定速率執行(fixedRate):

@Scheduled(fixedRate = 5000) 表示任務將在上一次任務開始執行后,5秒鐘再執行下一次任務。即任務之間的間隔時間固定為5秒。

  1. 固定延遲執行(fixedDelay):

@Scheduled(fixedDelay = 5000) 表示任務將在上一次任務執行結束后,等待5秒鐘再執行下一次任務。與fixedRate不同的是,fixedDelay計算的是任務結束與下一次任務開始之間的間隔。

  1. 首次延遲執行(initialDelay):

@Scheduled(initialDelay = 10000, fixedRate = 5000) 表示任務將在應用啟動后10秒鐘開始第一次執行,隨后每隔5秒執行一次。

  1. 使用 Cron 表達式:

@Scheduled(cron = "0 0/1 * * * ?") 表示任務將在每分鐘的第0秒執行一次。Cron表達式是一種非常靈活的時間表達方式,允許指定任務的精確執行時間,例如每小時的整點、每月的特定日期等。

通過以上的配置與注解使用方法,我們可以靈活地在Spring Boot應用中創建各種類型的定時任務,同時結合自定義線程池配置,確保任務的并發執行效率和系統的穩定性。

在src/main/java/com/icoderoad/taskmanager/task/目錄下創建MyScheduledTask.java類,用于定義我們的定時任務。

package com.icoderoad.taskmanager.task;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public void scheduleTaskWithFixedRate() {
        logger.info("固定速率任務執行時間: {}", dateTimeFormatter.format(LocalDateTime.now()));
    }

    public void scheduleTaskWithFixedDelay() {
        logger.info("固定延遲任務執行時間: {}", dateTimeFormatter.format(LocalDateTime.now()));
    }

    public void scheduleTaskWithInitialDelay() {
        logger.info("首次延遲任務執行時間: {}", dateTimeFormatter.format(LocalDateTime.now()));
    }

    public void scheduleTaskWithCronExpression() {
        logger.info("Cron表達式任務執行時間: {}", dateTimeFormatter.format(LocalDateTime.now()));
    }
}

在這個簡單的示例中,performTask()方法會每隔5秒鐘執行一次,并輸出當前的時間戳。

任務管理器的實現

為了控制定時任務的啟動和停止,我們可以創建一個任務管理器類。

在src/main/java/com/icoderoad/taskmanager/service/目錄下創建TaskSchedulerManager.java類:

此類提供了停止和重啟任務的功能。

控制器的實現

在src/main/java/com/icoderoad/taskmanager/controller/目錄下創建TaskController.java類:

package com.icoderoad.taskmanager.service;

import java.util.Date;
import java.util.concurrent.ScheduledFuture;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

import com.icoderoad.taskmanager.properties.TaskSchedulerProperties;
import com.icoderoad.taskmanager.task.ScheduledTask;

@Service
public class TaskSchedulerManager {

    private final TaskScheduler taskScheduler;
    private final TaskSchedulerProperties taskSchedulerProperties;
    private ScheduledFuture<?> fixedDelayTask;
    private ScheduledFuture<?> initialDelayTask;
    private ScheduledFuture<?> cronExpressionTask;
    private boolean isTaskRunning = false;

    @Autowired
    private ScheduledTask scheduledTaskBean;

    @Autowired
    public TaskSchedulerManager(TaskScheduler taskScheduler, TaskSchedulerProperties taskSchedulerProperties) {
        this.taskScheduler = taskScheduler;
        this.taskSchedulerProperties = taskSchedulerProperties;
        initializeScheduler();
    }

    private void initializeScheduler() {
        if (taskScheduler instanceof ThreadPoolTaskScheduler) {
            ((ThreadPoolTaskScheduler) taskScheduler).setPoolSize(taskSchedulerProperties.getSize());
        }
    }

    public void startTask() {
        if (!isTaskRunning) {
            fixedDelayTask = taskScheduler.scheduleWithFixedDelay(scheduledTaskBean::scheduleTaskWithFixedDelay, 5000);
            initialDelayTask = taskScheduler.schedule(() -> {
                scheduledTaskBean.scheduleTaskWithInitialDelay();
            }, new Date(System.currentTimeMillis() + 10000)); // 初始延遲任務,10秒后執行
            cronExpressionTask = taskScheduler.schedule(scheduledTaskBean::scheduleTaskWithCronExpression,
                new CronTrigger("0 0/1 * * * ?")); // Cron表達式任務
            isTaskRunning = true;
        }
    }

    public void stopTask() {
        if (isTaskRunning) {
            if (fixedDelayTask != null) {
                fixedDelayTask.cancel(true);
            }
            if (initialDelayTask != null) {
                initialDelayTask.cancel(true);
            }
            if (cronExpressionTask != null) {
                cronExpressionTask.cancel(true);
            }
            isTaskRunning = false;
        }
    }

    public boolean isTaskRunning() {
        return isTaskRunning;
    }
}

通過這個控制器,我們能夠處理來自前端頁面的請求,停止或重啟定時任務。

啟動應用程序

在src/main/java/com/icoderoad/taskmanager/目錄下創建TaskManagerApplication.java`類:

package com.icoderoad.taskmanager;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class TaskmanagerApplication {

	public static void main(String[] args) {
		SpringApplication.run(TaskmanagerApplication.class, args);
	}

}

在啟動類中,我們啟用了定時任務調度功能。

視圖控制器

package com.icoderoad.taskmanager.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

前端頁面(Thymeleaf + Bootstrap)

在src/main/resources/templates/目錄下創建一個簡單的HTML文件index.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>任務管理</title>
    <link  rel="stylesheet">
</head>
<body>
<div class="container">
    <h1 class="mt-5">定時任務管理</h1>
    <div class="mt-3">
        <button id="startBtn" class="btn btn-danger">啟動任務</button>
        <button id="stopBtn" class="btn btn-secondary" disabled>停止任務</button>
    </div>
    <div id="messageBox" class="alert mt-3" role="alert" style="display:none;"></div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script>
    $(document).ready(function() {
        function showMessage(type, message) {
            const messageBox = $('#messageBox');
            messageBox.removeClass('alert-success alert-danger').addClass('alert-' + type);
            messageBox.text(message);
            messageBox.show();
        }

        function updateButtonStates(isRunning) {
            if (isRunning) {
                $('#startBtn').removeClass('btn-danger').addClass('btn-secondary').prop('disabled', true);
                $('#stopBtn').removeClass('btn-secondary').addClass('btn-danger').prop('disabled', false);
            } else {
                $('#startBtn').removeClass('btn-secondary').addClass('btn-danger').prop('disabled', false);
                $('#stopBtn').removeClass('btn-danger').addClass('btn-secondary').prop('disabled', true);
            }
        }

        // 頁面加載時獲取任務狀態并更新按鈕狀態
        $.get("/task/status", function(response) {
            updateButtonStates(response.isRunning);
        });

        $('#startBtn').click(function() {
            $.post("/task/start-task", function(response) {
                if (response.status === 'success') {
                    showMessage('success', response.message);
                    updateButtonStates(true);
                } else {
                    showMessage('danger', response.message);
                }
            });
        });

        $('#stopBtn').click(function() {
            $.post("/task/stop-task", function(response) {
                if (response.status === 'success') {
                    showMessage('success', response.message);
                    updateButtonStates(false);
                } else {
                    showMessage('danger', response.message);
                }
            });
        });
    });
</script>
</body>
</html>

此頁面提供了簡單的按鈕,允許用戶停止或重啟定時任務。

運行與測試

啟動應用程序后,打開瀏覽器訪問http://localhost:8080/taskManager,你將看到管理定時任務的界面。點擊“停止任務”按鈕,可以停止定時任務;點擊“重啟任務”按鈕,則可以重新啟動定時任務。

總結

在本文中,我們通過Yaml屬性配置了自定義線程池,詳細介紹了@Scheduled注解的多種用法,并實現了一個能夠優雅地啟動和停止定時任務的管理系統。通過這種方式,我們可以靈活地控制應用中的定時任務,提高系統的穩定性和可維護性。這種設計非常適合在生產環境中應用,尤其是在需要頻繁調整任務調度策略的場景下。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-07-31 14:03:00

Spring定時任務管理

2024-09-04 11:16:44

端口Spring配置類

2024-08-30 11:28:09

2024-09-02 08:17:18

2024-09-06 10:05:47

SpELSpring權限

2019-02-20 15:52:50

技術開發代碼

2024-02-28 09:54:07

線程池配置

2017-08-16 16:41:04

JavaSpringBoot定時任務

2024-09-20 05:49:04

SpringBoot后端

2025-02-24 16:00:00

SpringBoot定時任務開發

2025-04-21 02:20:00

2021-04-11 07:48:42

定時任務Linux jdk

2012-02-07 13:31:14

SpringJava

2009-10-28 10:05:29

Ubuntucrontab定時任務

2010-03-10 15:47:58

crontab定時任務

2024-09-09 08:11:12

2023-01-04 09:23:58

2024-08-09 08:46:00

Springjar 包YAML

2024-10-28 08:32:22

統一接口響應SpringBoot響應框架

2023-10-31 12:42:00

Spring動態增刪啟停
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久久免费相片 | 午夜伦理在线视频| 青青草一区二区三区| 亚洲天堂网站在线观看视频| 欧美中文字幕在线观看视频| 99香蕉久久| 91黄色免费观看| 日韩一区二区电影在线观看| 在线一区视频观看| 一区二区在线观看不卡| 波多野结衣成人在线| 亚洲少妇视频| 亚洲精品一二三四区| 日本欧美色综合网站免费| 亚洲自拍电影| 亚洲精品福利免费在线观看| 91传媒在线观看| 成人亚洲一区二区一| 成人福利在线视频| 成人不卡视频| 色综合久久久久久久| 日本黄色a视频| 少妇精品久久久| 亚洲一区二区精品| 日本成在线观看| 久久99蜜桃精品| 91视频免费在线| 成人永久在线| 日韩视频免费直播| 可播放的18gay1069| 国产精品综合在线视频| 91久热免费在线视频| 伊人亚洲精品| 制服丝袜成人动漫| 日本18视频网站| 国产91在线观看丝袜| 国产精华一区二区三区| 精品国产一区二区三区成人影院 | 亚洲激情五月| 2019av中文字幕| 国产激情小视频在线| 亚洲国产美国国产综合一区二区| 9191国产视频| 精品国产91乱码一区二区三区四区| 色婷婷亚洲综合| 黄色免费观看视频网站| 日韩中文欧美在线| 日本国产精品视频| 欧美电影网址| 欧美日韩免费观看一区二区三区| 动漫精品视频| 国精产品一区一区三区mba下载| 亚洲福利国产精品| 自拍偷拍亚洲色图欧美| 国产精品成人自拍| 综合网中文字幕| 久久电影tv| 精品视频一区在线视频| 影音先锋在线视频| 88在线观看91蜜桃国自产| 国产高清一级毛片在线不卡| 91视频观看免费| 成人免费视频a| 性感av在线播放| 国产一区二区看久久| 91入口在线观看| 精品一区视频| 欧美一区二区三区播放老司机| 网站一区二区三区| 99精品视频一区| 欧美美女黄色网| 激情久久久久久久| 欧美精品videossex性护士| 黄页在线免费看| www.欧美亚洲| 精品国产乱子伦一区| 99999精品视频| 精品国产乱码久久久久久果冻传媒| 亚洲欧美日韩国产一区二区三区| 91免费看蜜桃| 色8久久影院午夜场| 欧美性生交xxxxx久久久| 91av影院| 国产91露脸合集magnet| 国产麻豆电影在线观看| 最新国产成人在线观看| 久久久久免费精品| 国产一区二区调教| 欧美日韩综合精品| 狠狠爱www人成狠狠爱综合网| 日韩美女免费视频| 欧美三级第一页| 午夜国产一区二区三区| 亚洲成人精品视频| 蜜桃在线一区| 538国产精品视频一区二区| 日韩三级成人| 日韩精品中文字| 天天干在线视频论坛| 日韩欧美中文在线| 成人免费高清| 国产精品视频免费一区| 一区二区三区不卡在线观看| 四虎精品永久免费| 亚洲精品免费在线看| 五月天精品一区二区三区| 亚洲综合资源| 国产精品日韩av| 精品一区二区国语对白| 国产 国语对白 露脸| 亚洲国产人成综合网站| 男女av在线| 欧美日产国产成人免费图片| 天堂俺去俺来也www久久婷婷| 国产91精品网站| 日韩av一区二区在线影视| 天堂地址在线www| 日本精品免费观看| 狠狠88综合久久久久综合网| 日韩中文字幕在线免费| 制服.丝袜.亚洲.中文.综合| 福利一区在线| 91精品国产91久久久久久久久 | 欧美不卡视频一区发布| 国产原创一区| 久热精品视频在线观看一区| 国产人与zoxxxx另类91| 欧美激情手机在线视频 | 日韩在线观看免费全| 高清全集视频免费在线| 中文字幕日韩av| 91久久夜色精品国产按摩| 国产成人a级片| 欧美大学生性色视频| 老司机精品视频在线| 精品久久久久一区二区三区| 国产99在线|中文| 久久久精品综合| 国产麻豆一区| 国产激情片在线观看| 亚洲国产福利在线| 性欧美精品高清| 福利视频在线看| 国产激情一区二区三区在线观看| 欧美日韩美女在线观看| ccyy激情综合| 自拍日韩亚洲一区在线| 欧美男生操女生| 欧美一区电影| 亚洲一级片网站| 国产视频精品在线| 伊人久久亚洲影院| 天堂av在线网站| www.欧美精品| aaa欧美日韩| 成人直播视频| 日韩av一级大片| 56国语精品自产拍在线观看| 久久国产成人精品| 国产精品无码乱伦| 中文字幕不卡在线| 四虎影视4hu4虎成人| 性chinese极品按摩| 激情一区二区三区| 亚洲天堂av综合网| 国产精品va| 正义之心1992免费观看全集完整版| 26uuu欧美日本| 男人天堂综合| 久久久久久久久久久久久久久久久久av | 国产午夜精品视频免费不卡69堂| 黄色成人在线视频| 欧美激情精品久久久| 欧美久久综合| aaa免费在线观看| 亚洲欧洲在线观看av| 精品国产免费人成网站| 色播五月综合| 日韩欧美不卡一区| 成人在线免费看片| 欧美亚州一区二区三区| 国产精品视频在线看| 日韩欧美高清在线播放| 亚洲网友自拍| 亚洲视频导航| 日韩中文在线中文网三级| 不卡一区二区在线| 精品国产91| 日本美女高清在线观看免费| 蜜桃成人在线| 亚洲人成电影在线| 亚洲人吸女人奶水| 亚洲中无吗在线| 欧美成人精品一区二区男人看| 国产成人精品免高潮在线观看| 欧美主播一区二区三区| 久久久国产亚洲精品| 黑人玩欧美人三根一起进| 久久免费看毛片| 亚洲欧美国产精品专区久久|