SpringBoot项目优雅停机+Pid暴力停机
bootstrap.yaml配置项目的pid输出位置
spring:
pid:
file: F:/cloud-nacos/cloud_gateway/application.pid
springboot项目修改启动类启动方式
原始启动类
SpringApplication.run(MainApplication.class, args);
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApp {
/**
* @author: GuoTong
* @date: 2022-10-05 10:42:59
*/
public static void main(String[] args) {
try {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication springApplication = new SpringApplication(MainApplication.class);
springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args);
} catch (Exception e) {
e.printStackTrace();
}
}
优雅停机和暴力停机的接口
package com.gton.shutdown;
import com.alibaba.cloud.commons.io.FileUtils;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.gton.config.Resp;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PreDestroy;
import java.io.File;
import java.io.IOException;
/**
* @description: 优雅停机?
* 简单的说,就是向应用进程发出停止指令之后,能保证正在执行的业务操作不受影响,
* 直到操作运行完毕之后再停止服务。
* @author: GuoTong
* @createTime: 2023-07-14 22:32
* @since JDK 1.8 OR 11
**/
@RestController
@Slf4j
public class ApplicationContextShutDown implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
/**
* Description: 优雅停机
*
* @author: GuoTong
* @date: 2023-07-14 22:46:01
* @return:void
*/
@GetMapping(value = {"/ShutDown", "/shutdown"})
public void shutdownFunction() {
log.info("Application Context Doing ShutDown .......");
((ConfigurableApplicationContext) context).close();
}
/**
* Description: 获取进程号
*
* @author: GuoTong
* @date: 2023-07-14 22:46:01
* @return:void
*/
@GetMapping(value = {"/queryPid", "/getPid"})
public Resp queryApplicationPid() {
String fileInputStreamPid = getPidFunction();
return Resp.Ok(fileInputStreamPid);
}
/**
* Description: 强行终止进程
*
* @author: GuoTong
* @date: 2023-07-14 22:46:01
* @return:void
*/
@GetMapping(value = {"/kill", "/stop", "/termination"})
public void termination() {
// 获取上下文环境信息{application.yml}
String pid = getPidFunction();
String endingApplicationShell = "kill -9 " + pid;
// java主要通过Runtime和Process执行Linux命令, Process是Runtime.exec返回值,可以用来对执行过程进行后续操作(获取结果,发送命令,等待结果)。
try {
log.info("强行终止进程 ,{}", endingApplicationShell);
Runtime.getRuntime().exec(endingApplicationShell);
} catch (IOException e) {
log.error("强行终止进程失败", e);
}
}
/**
* Description: 容器销毁前调用
*
* @author: GuoTong
* @date: 2023-07-14 22:42:19
* @return:
*/
@PreDestroy
public void PreDestroy() {
log.info("springBoot项目已经优雅关闭 .......");
}
/**
* Description:Springboot自身提供的优雅停机
*
* @param applicationContext
* @author: GuoTong
* @date: 2023-07-14 22:42:08
* @return:
*/
public void exitApplication(ApplicationContext applicationContext) {
// SpringApplication.exit()方法也可以安全的退出程序
int exit = SpringApplication.exit(applicationContext, (ExitCodeGenerator) () -> 0);
//同时会返回一个退出码,这个退出码可以传递给所有的context最后通过调用System.exit()可以将这个错误码也传给JVM。
System.exit(exit);
}
/**
* Description: 获取上下文环境信息{application.yml}PID
*
* @author: GuoTong
* @date: 2023-07-15 00:15:14
* @return:java.lang.String
*/
private String getPidFunction() {
Environment environment = context.getEnvironment();
String pidFileName = environment.getProperty("spring.pid.file");
if (StringUtils.isEmpty(pidFileName)) {
pidFileName = "application.pid";
}
String fileInputStreamPid = null;
try {
fileInputStreamPid = FileUtils.readFileToString(new File(pidFileName), CharsetUtil.UTF_8);
} catch (IOException e) {
log.info("获取Pid失败", e);
}
return fileInputStreamPid;
}
}
SpringBoot项目优雅停机+Pid暴力停机的更多相关文章
- 「SpringBoot」如何优雅地管理SpringBoot项目
本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的Sp ...
- SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!
大家都知道okhttp是一款由square公司开源的java版本http客户端工具.实际上,square公司还开源了基于okhttp进一步封装的retrofit工具,用来支持通过接口的方式发起http ...
- SpringBoot从入门到精通一(idea优雅搭建SpringBoot项目)
前言 在没有SpringBoot之前,我们搭建的是SSM(SpingMVC+Spring+Mybatis)项目,在搭建SSM项目的时候,我们要经过一系列的繁琐配置,例如:application,web ...
- SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2)
SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2) 优雅停止&暴力停止 暴力停止:像日常开发过程中,测试区或者本地开发时,我们并不会考虑项目关 ...
- SpringBoot如何优雅的使用RocketMQ
目录 SpringBoot如何优雅的使用RocketMQ SpringBoot如何优雅的使用RocketMQ MQ,是一种跨进程的通信机制,用于上下游传递消息.在传统的互联网架构中通常使用MQ来对上下 ...
- 补习系列(1)-springboot项目基础搭建课
目录 前言 一.基础结构 二.添加代码 三.应用配置 四.日志配置 五.打包部署 小结 前言 springboot 最近火的不行,目前几乎已经是 spring 家族最耀眼的项目了.抛开微服务.技术社区 ...
- SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1
在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...
- Eclipse 中构建 Maven 项目的完整过程 - SpringBoot 项目
进行以下步骤的前提是你已经安装好本地maven库和eclipse中的maven插件了(有的eclipse中已经集成了maven插件) 一.Maven项目的新建 1.鼠标右键---->New--- ...
- linux下后台启动springboot项目
linux下后台启动springboot项目 我们知道启动springboot的项目有三种方式: 运行主方法启动 使用命令 mvn spring-boot:run”在命令行启动该应用 运行“mvn p ...
- Jenkins部署码云SpringBoot项目
本文介绍jenkins如何从gitee上clone项目,然后使用maven打包并后台启动. 1.Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续 ...
随机推荐
- 20200411 联想Yoga 2 13升级大SSD
20200411:下文的操作实际发生在2018年11月,当时完成了就写好了这篇文章,却忘了放上来,最近家里一个电脑的硬盘坏了,来翻箱底才找到,现在发上来. 原配置:Lonevo Yoga2 13,唯一 ...
- ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式
在HTTP的语义中,重定向一般指的是服务端通过返回一个状态码为3XX的响应促使客户端像另一个地址再次发起请求,本章将此称为"客户端重定向".既然有客户端重定向,自然就有服务端重定向 ...
- 天下苦 Spring 久矣,Solon v2.3.3 发布
Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...
- 【HMS Core】华为帐号服务,获取Access Token报错{sub_error:20152,error_description:invalid code,error:1101}
[问题描述] 华为账号服务,接口获取Access Token报错:{sub_error:20152,error_description:invalid code,error:1101} [问题分析 ...
- 前端基于原生input组件的增强简单通用实用输入框
前端基于原生input组件的增强简单通用实用输入框,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12799 效果图如下: ...
- HCL实验6:静态路由
拓扑图 步骤: 连线,路由器与路由器通过S端口连接 配置好PC 配置路由器端口IP 配置路由器的下一跳地址(静态路由) 详细步骤 连线情况可见拓扑图 配置好PC 端口IP R1 [R1]int g0/ ...
- Spring 中 Bean 的配置细节
前言 大家好,我是 god23bin,今天继续说 Spring 的内容,关于 Spring 中 Bean 的配置的,通过上一篇文章的学习,我们知道了 Spring 中的依赖注入,其中有两种主要的方式, ...
- 新版Google浏览器跨域Cookie解决方案
一.前言 针对Chrome版本67及以上 不能将其他域的Cookie传递过来 注意,这个里面的SameSite不能设为null,设空的话,还是会走默认值Lax 其中,SameSite的值可以填3个:S ...
- [爬虫]1.2.1 HTML标签和属性
HTML(HyperText Markup Language)是一种用于创建网页的标记语言.HTML文档由一系列的HTML标签构成,每个标签都有自己的意义和用途.HTML标签通常成对出现,由一个开始标 ...
- yum与软件包
从一个命令开始 yum provides iostat ## 找到软件包名为:sysstat-10.1.5-19.el7.x86_64 安装软件包 yum install sysstat-10.1.5 ...