Spring Boot 优雅关机时异步线程安全优化

news2024/10/5 21:15:46

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

Spring Boot 优雅关机时异步线程安全优化

在现代微服务架构中,应用程序的可用性和稳定性至关重要。Spring Boot 提供了优雅关机(Graceful Shutdown)功能,以确保在服务关闭时能完成正在处理的请求并释放资源。然而,在涉及异步任务时,确保线程安全性和任务的正确终止尤为重要。本文将探讨如何在Spring Boot应用中实现优雅关机,并对异步线程进行安全优化。

为什么需要优雅关机?

优雅关机的主要目的是在关闭应用程序时,允许已经接收到的请求处理完成,而不再接受新的请求。这可以避免请求中途被打断,从而提供更好的用户体验。此外,它还允许释放资源,例如数据库连接和文件句柄,避免资源泄漏。

配置Spring Boot的优雅关机

Spring Boot从2.3.0版本开始支持优雅关机。通过在application.properties中配置以下参数,可以启用这一功能:

server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=30s

这将使Spring Boot在接收到关闭信号后,有一个30秒的时间窗口来完成正在处理的请求。

异步任务的优雅关机

在涉及异步任务时,确保它们在关机期间正确地完成或中止是一个挑战。以下是一些关键步骤来优化异步任务的线程安全和优雅关机。

1. 使用 ThreadPoolTaskExecutor

首先,配置一个自定义的 ThreadPoolTaskExecutor 来管理异步任务。它提供了更灵活的线程池管理,并支持优雅关机。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
public class AsyncConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("Async-");
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(30);
        executor.initialize();
        return executor;
    }
}

在这里,我们设置了 waitForTasksToCompleteOnShutdowntrue,并指定了 awaitTerminationSeconds 为 30秒,这意味着在应用关闭时,线程池将等待最多30秒来完成当前正在执行的任务。

2. 使用 @Async 注解

然后,在需要异步执行的方法上使用 @Async 注解,并指定使用自定义的任务执行器。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class MyAsyncService {

    @Async("taskExecutor")
    public void executeAsyncTask() {
        // 任务逻辑
        try {
            Thread.sleep(5000);  // 模拟长时间运行的任务
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("异步任务执行完成");
    }
}

通过这样配置,异步任务将在自定义的线程池中执行,并在应用关闭时遵循优雅关机的设置。

3. 确保任务的线程安全

在执行异步任务时,需要确保线程安全。常见的做法是使用线程安全的数据结构(例如 ConcurrentHashMap),或使用适当的同步机制(例如 synchronized 块)。

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@Service
public class ThreadSafeService {

    private final ConcurrentMap<String, String> dataMap = new ConcurrentHashMap<>();

    @Async("taskExecutor")
    public void updateData(String key, String value) {
        dataMap.put(key, value);
    }

    public String getData(String key) {
        return dataMap.get(key);
    }
}
4. 处理任务中断

在优雅关机过程中,异步任务可能会收到中断信号,因此需要正确处理中断异常。

@Async("taskExecutor")
public void executeInterruptibleTask() {
    try {
        // 模拟长时间运行的任务
        for (int i = 0; i < 10; i++) {
            Thread.sleep(1000);  // 每秒执行一次检查
            System.out.println("任务进行中...");
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();  // 恢复中断状态
        System.out.println("任务被中断");
    }
}

通过捕获 InterruptedException 并恢复线程的中断状态,可以确保任务在收到中断信号时能够正确处理。

结论

在Spring Boot中实现优雅关机不仅可以提高应用的稳定性,还可以确保在关闭期间异步任务能够安全地完成或中止。通过配置 ThreadPoolTaskExecutor 和使用 @Async 注解,可以有效管理异步任务的执行。同时,通过使用线程安全的数据结构和正确处理中断信号,可以进一步优化异步任务的安全性和可靠性。希望本文能够帮助你在实际项目中更好地实现优雅关机和异步线程安全优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1833137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】在运行中使用warnings.filterwarnings,可以忽略测试中遇到的问题

在 Python 中&#xff0c;warnings 是一个内置模块&#xff0c;用于发出有关程序执行的警告信息&#xff0c;这些警告信息通常是关于程序行为的潜在问题。 不过&#xff0c;这些问题通常不是致命的错误&#xff0c;只不过是展示我们代码中潜在的问题&#xff0c;或不推荐的做法…

红酒:家庭环境中如何创造理想的红酒储存环境

对于热爱品鉴红酒的人来说&#xff0c;如何在家庭环境中创造一个理想的红酒储存环境是至关重要的。理想的储存环境能够确保红酒的品质和口感长时间保持理想状态。下面云仓酒庄雷盛红酒将介绍一些在家庭环境中创造理想红酒储存环境的建议&#xff1a; 温度控制&#xff1a;红酒的…

2024年ERP软件公司排名前十!

在当今的商业环境中&#xff0c;ERP&#xff08;企业资源规划&#xff09;系统已成为企业日常运营不可或缺的一部分。然而&#xff0c;如何在这众多的ERP系统软件中筛选出最适合自己的一款&#xff0c;成为许多企业共同面临的挑战。今天&#xff0c;我将带大家盘点erp软件公司的…

生成式AI新篇章:亚马逊云科技助力重塑数字未来

编辑&#xff1a;阿冒 设计&#xff1a;沐由 “任何非常先进的技术&#xff0c;初看都与魔法无异。”对于这句话&#xff0c;想必科幻迷们应该不会感到陌生。这则广为人知的定律&#xff0c;是著名科幻小说作家亚瑟克拉克在《2001太空漫游》中提出的。 正因为如此&#xff0c;当…

知识图谱存在的挑战---隐私、安全和伦理相关和测试认证相关

文章目录 隐私、安全和伦理相关测试认证相关 隐私、安全和伦理相关 从部署拓扑结构而言&#xff0c;知识图谱技术以数据为核心、数据库为载体的方式来存储&#xff0c;有单机、云平台、集群及其组合的部署方式&#xff0c;结合大数据平台、云平台、业务系统、灾备、网络系统及其…

【代码随想录】【算法训练营】【第41天】 [416]分割等和子集

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 40&#xff0c;休息&#xff0c;休息一下~ day 41&#xff0c;艰难的周一~ 题目详情 [416] 分割等和子集 题目描述 416 分割等和子集 解题思路 前提&#xff1a;是否可以将数组分为和相等的…

cloud_enum:一款针对不同平台云环境安全的OSINT工具

关于cloud_enum cloud_enum是一款功能强大的云环境安全OSINT工具&#xff0c;该工具支持AWS、Azure和Google Cloud三种不同的云环境&#xff0c;旨在帮助广大研究人员枚举目标云环境中的公共资源&#xff0c;并尝试寻找其中潜在的安全威胁。 功能介绍 当前版本的cloud_enum支…

VBA学习(2):Excel VBA初学者编写第一个宏

要在Excel中编写宏程序&#xff0c;首先需要了解VBA语言&#xff0c;而快速入门的技巧就是使用宏录制器。 宏录制器就像一台录音机&#xff0c;可以使用VBA监听和记录你在Excel中所做的一切操作。对于初学者来说&#xff0c;你可能不了解VBA&#xff0c;这里&#xff0c;我们会…

如何利用被动DNS(Passive DNS)加强网络安全

通过收集和分析被动DNS数据&#xff0c;可以帮助识别恶意站点&#xff0c;打击钓鱼和恶意软件&#xff0c;本文将介绍如何利用被动DNS&#xff08;Passive DNS&#xff09;加强网络安全。 在过去的一些年里&#xff0c;我们目睹了对DNS基础设施的攻击日益增多&#xff1a;对权…

【S32K 进阶之旅】 将 EB 配置生成的 MCAL 代码集成到 S32DS 中

本文介绍如何使用 S32DS 进行 AUTOSAR MCAL 工程的编译和调试&#xff0c;重点在于将 EB 配置生成的 MCAL 代码集成到 S32DS 中。 虽然配置过程较为繁琐&#xff0c;实操过一遍就会熟悉整个工程的框架。以后每次在 EB 中更新配置&#xff0c;生成代码的文件夹已经集成在 S32DS…

Selenium+Pytest自动化测试框架能碰撞出什么样的火花

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 一、测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高…

从多线程设计模式到对 CompletableFuture 的应用

大家好&#xff0c;我是 方圆。最近在开发 延保服务 频道页时&#xff0c;为了提高查询效率&#xff0c;使用到了多线程技术。为了对多线程方案设计有更加充分的了解&#xff0c;在业余时间读完了《图解 Java 多线程设计模式》这本书&#xff0c;觉得收获良多。本篇文章将介绍其…

《C++ Primer》导学系列:第 4 章 - 表达式

4.1 基础 4.1.1 基本概念 组合运算符和运算对象 组合运算符是指将两个或多个操作数结合在一起进行运算的符号。在C中&#xff0c;常见的组合运算符包括算术运算符&#xff08;如, -, *, /, %&#xff09;、关系运算符&#xff08;如<, >, <, >, , !&#xff09;…

docker-compose jira、bugzilla、zentao

参见文章&#xff0c;这里是对之前的内容进行了改动&#xff0c;主要讲怎么将zentao容器融入到已有的docker-compose.yml中 一、zentao镜像 从官网上拉取&#xff1a;https://hub.docker.com/r/easysoft/zentao/tags 可以选择自己想要的版本&#xff0c;这里我选择的是开源版…

工厂物料管理系统(数据库课设)

1.课设要求描述 ●实现物料的分类管理; ●实现部门和员工信息管理; ●实现物料的入库和领用管理; ●实现物料的转仓管理; ●创建触发器&#xff0c;实现物料入库和领用时相应物料库存的自动更新; ●创建触发器&#xff0c;实现转仓时转入仓库物料增加、转出仓库物料减少…

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)

时域自适应滤波算法中的线性卷积和线性相关运算量较大&#xff0c;导致计算复杂度升高&#xff0c;我们更愿意把这两个信号变换到频域&#xff0c;通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识&#xff1a;线性卷积&#xff08;相关&#xff09;和圆…

单一管理平台 - Enterprise Global Console

大约三年前&#xff0c;当我们向客户和社区推出控制台时&#xff0c;MinIO 的世界发生了变化。这是可访问性的巨大飞跃。可靠的 CLI 和 MC 命令很快让位于我们新的基于浏览器的 GUI 的速度和直观可用性。对于开发人员和企业 IT 管理员来说&#xff0c;这是一个游戏规则的改变者…

单片机建立自己的库文件(4)

文章目录 前言一、新建自己的外设文件夹1.新建外设文件夹&#xff0c;做项目好项目文件管理2.将之前写的.c .h 文件添加到文件夹中 二、在软件中添加项目 .c文件2.1 编译工程保证没问题2. 修改项目列表下的名称 三、在软件项目中添加 .h文件路径四、实际使用测试总结 前言 提示…

使用 C# 进行面向对象编程:第 10 部分

封装和抽象之间的区别 对于 OOP 初学者来说&#xff0c;封装和抽象之间存在非常基本的区别。他们可能会对此感到困惑。但如果你详细了解这两个主题&#xff0c;就会发现它们之间存在巨大差异。 抽象意味着向用户隐藏不必要的数据。用户只需要所需的功能或根据其需求的输出。例…

遵循法规,科学检测:可燃气体报警器多久检测一次?

在工业生产和日常生活中&#xff0c;可燃气体报警器作为一种重要的安全设备&#xff0c;能够实时监测并预警潜在的可燃气体泄漏风险&#xff0c;对于防范火灾和爆炸事故至关重要。 在这篇文章中&#xff0c;佰德将围绕可燃气体报警器的检测频率展开探讨&#xff0c;包括其功能…