欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot項(xiàng)目平滑關(guān)閉及自動(dòng)化關(guān)閉腳本

 更新時(shí)間:2019年05月31日 09:16:58   作者:CarolLXW  
這篇文章主要為大家詳細(xì)介紹了Springboot項(xiàng)目平滑關(guān)閉及自動(dòng)化關(guān)閉腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Springboot項(xiàng)目平滑關(guān)閉及自動(dòng)化關(guān)閉腳本,供大家參考,具體內(nèi)容如下

核心代碼

  • GracefulShutdown.java
  • Shutdown.java
  • ApplicationStarterRunner.java
  • CommonInfo.java
  • HttpCommonUtil.java
  • application.properties

操作步驟

核心代碼

GracefulShutdown.java

package cnkj.site.utils;

import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.util.LifecycleBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.ContextClosedEvent;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/*
 * @version 1.0 created by Carol on 2019/4/25 16:22
 */
public class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
 private static final Logger LOGGER = LoggerFactory.getLogger(GracefulShutdown.class);

 private volatile Connector connector;

 @Override
 public void customize(Connector connector) {
 this.connector = connector;
 }
 @Override
 public void onApplicationEvent(ContextClosedEvent event) {
 try {
  // 指定執(zhí)行的方法
  shutdown();
  //手動(dòng)清理內(nèi)存
  System.gc();
  LOGGER.warn("清理內(nèi)存完畢,正在退出服務(wù)......");
  if (this.connector == null){
  return;
  }
  this.connector.pause();
  LOGGER.warn("關(guān)閉全部連接......");
  Executor executor = this.connector.getProtocolHandler().getExecutor();
  if (executor instanceof ThreadPoolExecutor) {
  try {
   ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
   threadPoolExecutor.shutdown();
   LOGGER.warn("當(dāng)前服務(wù)線程池被關(guān)閉");
   if (!threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS)) {
   LOGGER.warn("Tomcat thread pool did not shut down gracefully within 30 seconds. Proceeding with forceful shutdown");
   }
  } catch (InterruptedException ex) {
   Thread.currentThread().interrupt();
  }
  }
  this.connector.stop();
 } catch (LifecycleException e) {
  e.printStackTrace();
 }
 }

 @Bean
 public GracefulShutdown gracefulShutdown() {
 return new GracefulShutdown();
 }
 @Bean
 public ConfigurableServletWebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
 TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
 factory.addConnectorCustomizers(gracefulShutdown);
 return factory;
 }


 /**
 * 執(zhí)行服務(wù)關(guān)閉前的一些定制化操作
 * 通常需要確認(rèn)以下步驟
 * 1.關(guān)閉kafka等數(shù)據(jù)連接
 * 2.flush內(nèi)存中全部的未處理數(shù)據(jù)
 * 3.清理服務(wù)中全部待處理的數(shù)據(jù)
 */
 public void shutdown(){}
}

Shutdown.java

import cnkj.site.utils.GracefulShutdown;
import org.springframework.stereotype.Component;

/*
 * @version 1.0 created by Carol on 2019/4/25 16:39
 */
@Component
public class Shutdown extends GracefulShutdown {

 @Override
 public void shutdown() {
 // TODO 定制化關(guān)閉操作流程
 // 關(guān)閉 kafka 消費(fèi)
 // flush全部讀寫流
 // 清空隊(duì)列
 // 關(guān)閉全部文件流讀寫
 }
}

ApplicationStarterRunner.java

package cn.migu.log.component;

import cnkj.site.utils.HttpCommonUtil;
import cnkj.site.CommonInfo;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/*
 * @version 1.0 created by LXW on 2019/3/14 17:05
 */
@Component
public class ApplicationStarterRunner implements CommandLineRunner {

 @Override
 public void run(String... args) throws Exception {
 // 設(shè)置服務(wù)名
 commonInfo.setSERVICE_NAME("Service-Name");
 // 自動(dòng)設(shè)置服務(wù)啟動(dòng)后的進(jìn)程號(hào)
 commonInfo.setSERVICE_PID(HttpCommonUtil.getCurrentPid());
 }
}

CommonInfo.java

package cnkj.site.utils;

import lombok.Builder;
import lombok.Data;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;


@Data
@Component
public class CommonInfo implements InfoContributor {

 //當(dāng)前服務(wù)名
 private String SERVICE_NAME="SERVICE_NAME";
 //服務(wù)當(dāng)前狀態(tài)
 private int SERVICE_PID;


 @Override
 public void contribute(Info.Builder builder) {
 builder.withDetail("SERVICE_NAME",SERVICE_NAME);
 builder.withDetail("SERVICE_PID", SERVICE_PID);
 }

 public void clearAll(){
 this.SERVICE_NAME="";
 this.SERVICE_PID=-1;
 }

 public Map getAll(){
 Map map = new HashMap();
 map.put("SERVICE_NAME", getSERVICE_NAME());
 map.put("SERVICE_PID", getSERVICE_PID());
 return map;
 }


}

HttpCommonUtil.java

package cnkj.site.utils;

import javax.servlet.http.HttpServletRequest;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 * @version 1.0 created by Carol on 2018/10/25 10:04
 */
public class HttpCommonUtil {

 /**
 * 獲取當(dāng)前服務(wù)的PID
 * @return PID
 */
 public static Integer getCurrentPid(){
 String name = ManagementFactory.getRuntimeMXBean().getName();
 String pid = name.split("@")[0];
 return Integer.valueOf(pid);
 }
}

application.properties

#服務(wù)關(guān)閉
management.endpoint.shutdown.enabled=true
#監(jiān)控相關(guān)
management.endpoint.prometheus.enabled=true
management.endpoints.web.exposure.include=info

操作步驟

項(xiàng)目使用步驟:

1.拷貝上面的 Shutdown.java 代碼到自己的項(xiàng)目中
2.在 Shutdown.java 文件中的shutdown 方法中寫定制化的關(guān)閉操作流程

腳本使用步驟:

1.從git獲取最新的項(xiàng)目關(guān)閉腳本 地址
2.壓縮server_close 為server_close.zip
3.上傳 server_close.zip 到你服務(wù)所在服務(wù)器上的 /data/shell 路徑下
4.配置環(huán)境變量 vim /etc/profile
5.在profile文件的最下面新增 export PATH=/data/shell/server_close:$PATH
6.保存并退出 :wq
7.如果提示 /bin/bash^M: bad interpreter: No such file or directory,請(qǐng)vim serviceControll.sh,然后 :set fileformat=unix ,然后 :wq 保存并退出即可
8.cd /data/shell/server_close & ./serviceControll.sh 運(yùn)行即可使用服務(wù)關(guān)閉腳本

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java中Duration類的使用方法

    詳解Java中Duration類的使用方法

    Duration類通過秒和納秒相結(jié)合來描述一個(gè)時(shí)間量,最高精度是納秒。本文將通過示例詳細(xì)為大家講講Duration類的使用,需要的可以參考一下
    2022-05-05
  • Spring Boot 2 整合 QuartJob 實(shí)現(xiàn)定時(shí)器實(shí)時(shí)管理功能

    Spring Boot 2 整合 QuartJob 實(shí)現(xiàn)定時(shí)器實(shí)時(shí)管理功能

    Quartz是一個(gè)完全由java編寫的開源作業(yè)調(diào)度框架,形式簡易,功能強(qiáng)大。接下來通過本文給大家分享Spring Boot 2 整合 QuartJob 實(shí)現(xiàn)定時(shí)器實(shí)時(shí)管理功能,感興趣的朋友一起看看吧
    2019-11-11
  • Java?源碼重讀系列之?HashMap

    Java?源碼重讀系列之?HashMap

    這篇文章主要為大家介紹了Java源碼重讀系列之HashMap示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java?LocalDateTime獲取時(shí)間信息、格式化、轉(zhuǎn)換為數(shù)字時(shí)間戳代碼示例

    Java?LocalDateTime獲取時(shí)間信息、格式化、轉(zhuǎn)換為數(shù)字時(shí)間戳代碼示例

    其實(shí)我們?cè)贘ava項(xiàng)目中對(duì)日期進(jìn)行格式化,主要是利用一些日期格式化類,下面這篇文章主要給大家介紹了關(guān)于Java?LocalDateTime獲取時(shí)間信息、格式化、轉(zhuǎn)換為數(shù)字時(shí)間戳的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java中TCP/UDP詳細(xì)總結(jié)

    java中TCP/UDP詳細(xì)總結(jié)

    本篇文章對(duì)Java中的TCP/UDP知識(shí)點(diǎn)進(jìn)行了歸納總結(jié)分析。需要的朋友參考下
    2017-04-04
  • 一文掌握Spring中循環(huán)依賴與三級(jí)緩存

    一文掌握Spring中循環(huán)依賴與三級(jí)緩存

    這篇文章主要介紹了Spring中循環(huán)依賴與三級(jí)緩存,Spring通過三級(jí)緩存解決了循環(huán)依賴,其中一級(jí)緩存為單例池,二級(jí)緩存為早期曝光對(duì)象earlySingletonObjects,三級(jí)緩存為早期曝光對(duì)象工廠(singletonFactories),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2023-09-09
  • 類似Object監(jiān)視器方法的Condition接口(詳解)

    類似Object監(jiān)視器方法的Condition接口(詳解)

    下面小編就為大家?guī)硪黄愃芆bject監(jiān)視器方法的Condition接口(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java數(shù)組的定義、初始化、及二維數(shù)組用法分析

    Java數(shù)組的定義、初始化、及二維數(shù)組用法分析

    這篇文章主要介紹了Java數(shù)組的定義、初始化、及二維數(shù)組用法,結(jié)合具體實(shí)例形式分析了java數(shù)組概念、功能、數(shù)組定義、靜態(tài)數(shù)組、動(dòng)態(tài)數(shù)組、二維數(shù)組等相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • SpringBoot開發(fā)實(shí)戰(zhàn)系列之動(dòng)態(tài)定時(shí)任務(wù)

    SpringBoot開發(fā)實(shí)戰(zhàn)系列之動(dòng)態(tài)定時(shí)任務(wù)

    在我們?nèi)粘5拈_發(fā)中,很多時(shí)候,定時(shí)任務(wù)都不是寫死的,而是寫到數(shù)據(jù)庫中,從而實(shí)現(xiàn)定時(shí)任務(wù)的動(dòng)態(tài)配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開發(fā)實(shí)戰(zhàn)系列之動(dòng)態(tài)定時(shí)任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • java實(shí)現(xiàn)文件上傳下載

    java實(shí)現(xiàn)文件上傳下載

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件上傳下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評(píng)論