Browse Source

【resi-group】服务增加优雅停止的配置和逻辑

dev_shibei_match
wxz 5 years ago
parent
commit
b87a28e0a0
  1. 24
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownConfig.java
  2. 52
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java
  3. 17
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/ShutdownProperties.java
  4. 9
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/test/TestController.java
  5. 6
      epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml

24
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;
}
}

52
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<ContextClosedEvent> {
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();
}
}
}
}

17
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;
}
}

9
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();
}
}

6
epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml

@ -140,3 +140,9 @@ dingTalk:
robot:
webHook: @dingTalk.robot.webHook@
secret: @dingTalk.robot.secret@
# 停机选项
shutdown:
graceful:
enable: true #是否开启优雅停机
waitTimeSecs: 3 # 优雅停机等待时间,超过30秒,发出告警
Loading…
Cancel
Save