SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备(例如硬盘)是否可读写,但在Java中并没有直接针对硬件级别的磁盘探活API。然而,我们可以模拟一个场景,即检查某个目录或文件是否可以被Java程序正常读写,以此作为主盘活跃的一个间接判断依据。
在这里插入图片描述

[Ref] What is @Scheduled does?
在这里插入图片描述

第1步:创建定时任务服务类
构造一个探活线程池,执行探活线程任务

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;@Slf4j
@Component
public class StorageHealthyCheckTask {private static volatile AtomicBoolean isActive = new AtomicBoolean(true);@Value("${storage.path}")private String storagePath;@Value("${storage.needCheck}")private boolean needCheck;private final ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1), new ThreadFactoryBuilder().setNameFormat("探活检查-%d").setDaemon(true).build(), new ThreadPoolExecutor.DiscardPolicy());@Scheduled(cron = "0/5 * * * * ?") // 每分钟执行一次private void storageHealthyCheck() {log.info("{}线程 调用:storageHealthyCheck start", Thread.currentThread().getName());if (!needCheck) {log.info("no need check");return;}// true表示正常状态,则已知探活if (BooleanUtils.isTrue(isActive.get())) {check(Paths.get(storagePath), isActive);} else {// false表示失败,则报错log.error("isActive:{}", false);}log.info("{}线程 调用:storageHealthyCheck end \n", Thread.currentThread().getName());}private void check(Path path, AtomicBoolean flag) {try {Future<Boolean> future = executor.submit(() -> {try {log.info("{}线程 测试isReadable", Thread.currentThread().getName());// true表示有读权限,false表没读权限,超时中断就会异常退出return Files.isReadable(path);} finally {// 只要路径存在且可读, 就可以认为存储服务是健康的flag.set(true);}});Boolean res = future.get(2, TimeUnit.SECONDS);log.info("{}线程 isReadable结果: {}", Thread.currentThread().getName(), res);} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重新设置中断状态log.error("Thread was interrupted while waiting for the check task to complete.", e);flag.set(false);} catch (TimeoutException e) {log.error("Check task did not complete within the timeout of 2 seconds.", e);flag.set(false);} catch (CancellationException e) {log.error("Check task was cancelled before it could complete.", e);flag.set(false);} catch (ExecutionException e) {log.error("An error occurred while executing the check task", e);flag.set(false);}}
}

第2步:在application.yaml中添加定时任务相关的属性
配置支持探活开关,以主盘路径

storage:path: C:\Users\zhang\Desktop\testneedCheck: true

第3步:添加@EnableScheduling注解来启用定时任务调度功能

@SpringBootApplication
@MapperScan("com.zhangziwa.practisesvr.mapper")
@EnableScheduling
public class PractisesvrApplication {public static void main(String[] args) {SpringApplication.run(PractisesvrApplication.class, args);}
}

第4步:单独记录探活日志

<RollingFile name="storage_check"fileName="${LOG_HOME}/storage_check.log"filePattern="${LOG_HOME}/storage_check_%d{yyyy-MM-dd-HH}_%i.log.gz"createOnDemand="true"><PatternLayout pattern="${LOG_PATTERN}"/><Policies><SizeBasedTriggeringPolicy size="1M"/></Policies><DefaultRolloverStrategy fileIndex="nomax"><Delete basePath="${LOG_HOME}" maxDepth="2"><IfFileName glob="*.log.gz"><IfAny><IfAccumulatedFileSize exceeds="10M"/><IfAccumulatedFileCount exceeds="100"/><IfLastModified age="30d"/></IfAny></IfFileName></Delete></DefaultRolloverStrategy>
</RollingFile><logger name="com.zhangziwa.practisesvr.utils.task.StorageHealthyCheckTask" level="info" additivity="false"><AppenderRef ref="CONSOLE"/><AppenderRef ref="storage_check"/>
</logger>

第5步:起服务验证
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络防御安全知识(第三版)

配置黑洞路由 --- 黑洞路由即空接口路由&#xff0c;在NAT地址池中的地址&#xff0c;建议配置达到这个地址指 向空接口的路由&#xff0c;不然&#xff0c;在特定环境下会出现环路。&#xff08;主要针对地址池中的地址和出接口地址 不再同一个网段中的场景。&#xff09; …

Log4j2的Appenders配置详解

官方配置文档 https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender <Appenders> 常使用的类如下&#xff1a; org.apache.log4j.ConsoleAppender&#xff08;控制台&#xff09; org.apache.log4j.FileAppender&#xff08;文件&#xff…

vue3-深入组件-透传属性

透传属性 &#xff08;透传 attribute&#xff09; 什么是透传属性&#xff08;透传 attribute&#xff09;? 传递给一个组件&#xff0c;却没有被该组件声明为 props 或 emits 的 attribute 或者是事件监听器&#xff0c;例如 class style id 等。 属性继承 当一个组件以单…

如何搭建开源笔记Joplin服务并实现远程访问本地数据

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

类和对象(2)之类的6个默认成员函数(2)

上次我们梳理了初始化和清理的知识点&#xff0c;今天我们要梳理的是拷贝赋值的知识点。 拷贝构造函数 看到拷贝构造函数这个名字就能看的出来它是一个构造函数&#xff0c;所以它的语法和构造函数很相似。 既然他是一个构造函数&#xff0c;那么他就具有构造函数的语法&…

二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-4 Document

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>Document</title> </head><body> <canvas id"cavsElem" width"400" height"600">您的浏览器不支持Canvas…

如何实现Win系统ssh连接Ubuntu使用vscode远程敲代码

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接…

Android Settings 按住电源按钮

如题&#xff0c;Android 原生 Settings 里有个 按住电源按钮 的选项&#xff0c;可以设置按住电源按钮的操作。 按住电源按钮 两个选项的 UI 是分离的&#xff0c; 电源菜单 代码在 packages/apps/Settings/src/com/android/settings/gestures/LongPressPowerForPowerMen…

存储技术架构演进

一. 演进过程 存储技术架构的演进主要是从集中式到分布式的一种呈现&#xff0c;集中式存储模式凭借其在稳定性和可靠性方面的优势成为许多业务数据库的数据存储首选&#xff0c;顾名思义&#xff0c;集中式存储主要体现在集中性&#xff0c;一套集中式管理的存储系统&#xff…

SpringBoot项目配置SSL后,WebSocket连接失败的解决方案

SpringBoot项目配置SSL后&#xff0c;WebSocket连接应使用wss协议&#xff0c;而不是ws协议。在前端配置WebSocket时&#xff0c;URL以wss://开头。

基于springboot的房屋交易系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…