From 790f49a43ea23ae1381e15954b84220995667ab3 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 11 Dec 2020 10:23:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?BaseLogAspect=E4=BF=AE=E6=94=B9RenException?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF=E7=A0=81=E5=88=A4=E6=96=AD=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=98=AF>8000=E8=BF=94=E5=9B=9E=E7=BB=99?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=EF=BC=8C=E5=B0=B1=E6=89=93=E5=8D=B0?= =?UTF-8?q?warn=E7=BA=A7=E5=88=AB=E6=97=A5=E5=BF=97=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E6=8A=A5=E8=AD=A6=E7=BB=99=E9=92=89=E9=92=89=E3=80=82?= =?UTF-8?q?=E5=A6=82=E6=9E=9C<=3D8000=E5=88=99=E4=BE=9D=E6=97=A7=E6=89=93?= =?UTF-8?q?=E5=8D=B0error=E6=97=A5=E5=BF=97=EF=BC=8C=E6=8A=A5=E8=AD=A6?= =?UTF-8?q?=E7=BB=99=E9=92=89=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/aspect/BaseRequestLogAspect.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java index 8dd819e4b7..ff877a04be 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java @@ -66,7 +66,12 @@ public abstract class BaseRequestLogAspect { resultInfoLog(transactionSerial, getExecPeriod(startTime), result); } catch (RenException e) { result = handleRenException(e); - resultErrorLog(transactionSerial, getExecPeriod(startTime), result, e.getInternalMsg(), ExceptionUtils.getErrorStackTrace(e)); + if (e.getCode() > 8000) { + resultWarnLog(transactionSerial, getExecPeriod(startTime), result, e.getInternalMsg(), ExceptionUtils.getErrorStackTrace(e)); + } else { + resultErrorLog(transactionSerial, getExecPeriod(startTime), result, e.getInternalMsg(), ExceptionUtils.getErrorStackTrace(e)); + } + return result; } catch (ValidateException e) { result = handleValidateException(e); resultErrorLog(transactionSerial, getExecPeriod(startTime), result, e.getMsg(), ExceptionUtils.getErrorStackTrace(e)); @@ -95,7 +100,7 @@ public abstract class BaseRequestLogAspect { } /** - * 异常信息 + * 异常错误级别日志 * @param transactionSerial * @param execTimeMillis * @param result @@ -107,6 +112,19 @@ public abstract class BaseRequestLogAspect { transactionSerial, execTimeMillis, result == null ? result : result.toString(), exceptionMsg, exceptionDetail); } + /** + * 异常警告级别日志 + * @param transactionSerial + * @param execTimeMillis + * @param result + * @param exceptionMsg + * @param exceptionDetail + */ + private void resultWarnLog(String transactionSerial, Long execTimeMillis, Object result, String exceptionMsg, String exceptionDetail) { + log.warn("<<<<<<<<异常响应<<<<<<<<:事务流水号:{}, 执行时长:{}ms, 响应数据:{}, 异常信息:{}, 堆栈信息:{}", + transactionSerial, execTimeMillis, result == null ? result : result.toString(), exceptionMsg, exceptionDetail); + } + /** * 计算执行周期 * @param startTime From b87a28e0a0d0b46819ef4f07b131ab16613b3899 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 11 Dec 2020 14:10:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E3=80=90resi-group=E3=80=91=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=A2=9E=E5=8A=A0=E4=BC=98=E9=9B=85=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=E5=92=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/config/GracefulShutdownConfig.java | 24 +++++++++ .../epmet/config/GracefulShutdownTomcat.java | 52 +++++++++++++++++++ .../com/epmet/config/ShutdownProperties.java | 17 ++++++ .../epmet/modules/test/TestController.java | 9 ++++ .../src/main/resources/bootstrap.yml | 8 ++- 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownConfig.java create mode 100644 epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java create mode 100644 epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/ShutdownProperties.java diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownConfig.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownConfig.java new file mode 100644 index 0000000000..c43854a583 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownConfig.java @@ -0,0 +1,24 @@ +package com.epmet.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 优雅停机配置 + * matchIfMissing:当缺少shutdown.graceful.enable配置的时候,是否加载该配置类。true:缺少也加载,false:默认的,缺少配置不加载,即不生效 + */ +@Configuration +@ConditionalOnProperty(prefix = "shutdown.graceful", name = "enable", havingValue = "true", matchIfMissing = false) +public class GracefulShutdownConfig { + + @Bean + public ServletWebServerFactory servletContainer(GracefulShutdownTomcat gracefulShutdownTomcat) { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); + tomcat.addConnectorCustomizers(gracefulShutdownTomcat); + return tomcat; + } + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java new file mode 100644 index 0000000000..117a658b32 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java @@ -0,0 +1,52 @@ +package com.epmet.config; + +import com.epmet.commons.tools.exception.RenException; +import net.bytebuddy.implementation.bytecode.Throw; +import org.apache.catalina.connector.Connector; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.stereotype.Component; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@EnableConfigurationProperties(ShutdownProperties.class) +@Component +public class GracefulShutdownTomcat implements TomcatConnectorCustomizer, ApplicationListener { + + private static final Logger logger = LoggerFactory.getLogger(GracefulShutdownTomcat.class); + + @Autowired + private ShutdownProperties shutdownProperties; + + private volatile Connector connector; + + @Override + public void customize(Connector connector) { + this.connector = connector; + } + @Override + public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { + this.connector.pause(); + Executor executor = this.connector.getProtocolHandler().getExecutor(); + long waitTimeSecs = shutdownProperties.getGraceful().getWaitTimeSecs(); + if (executor instanceof ThreadPoolExecutor) { + try { + ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor; + threadPoolExecutor.shutdown(); + if (!threadPoolExecutor.awaitTermination(waitTimeSecs, TimeUnit.SECONDS)) { + String msg = String.format("Tomcat在【%s】秒内优雅停机失败,请手动处理", waitTimeSecs); + logger.error(msg); + } + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + } +} \ No newline at end of file diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/ShutdownProperties.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/ShutdownProperties.java new file mode 100644 index 0000000000..6be38ccc93 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/ShutdownProperties.java @@ -0,0 +1,17 @@ +package com.epmet.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "shutdown") +@Data +public class ShutdownProperties { + + private GracefulShutdownProperties graceful; + + @Data + public static class GracefulShutdownProperties { + private long waitTimeSecs = 30; + } + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/test/TestController.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/test/TestController.java index e68a222f27..c86286bfc5 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/test/TestController.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/test/TestController.java @@ -18,4 +18,13 @@ public class TestController { return new Result().ok(requestServerNameAndPort); } + @PostMapping("shutdown") + public Result testShutdown() throws InterruptedException { + for (int i = 1; i <= 10; i++) { + System.out.println(i); + Thread.sleep(1000l); + } + return new Result(); + } + } diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml b/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml index 717cff838d..fad0c9c313 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml +++ b/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml @@ -139,4 +139,10 @@ thread: dingTalk: robot: webHook: @dingTalk.robot.webHook@ - secret: @dingTalk.robot.secret@ \ No newline at end of file + secret: @dingTalk.robot.secret@ + +# 停机选项 +shutdown: + graceful: + enable: true #是否开启优雅停机 + waitTimeSecs: 3 # 优雅停机等待时间,超过30秒,发出告警 \ No newline at end of file