我英语不好,所以希望你能理解。
在Spring Boot上使用tomcat时, connector.pause()似乎无法按我的意愿工作。 我想要的是一种情况,当请求到达服务器时,kill会立即开始引发错误。
因此,我直接触摸了<strong> protocolHandler ,如下所示。当我这样做时,我确认它可以按我的意愿工作。但是,我想征求您的意见,此代码将导致副作用。
请发表评论。
public class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
private volatile Connector connector;
private static final String protocolHandlerClassName = "org.apache.coyote.http11.Http11NioProtocol";
@Override
public void customize(Connector connector) {
this.connector = connector;
}
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
// this.connector.pause();
this.protocolHandlerClose();
Executor executor = this.connector.getProtocolHandler().getExecutor();
if (executor instanceof ThreadPoolExecutor) {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
threadPoolExecutor.shutdown();
try {
if (!threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS)) {
threadPoolExecutor.shutdownNow();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void protocolHandlerClose() {
try {
Class<?> clazz = Class.forName(protocolHandlerClassName);
ProtocolHandler p = (ProtocolHandler) clazz.getConstructor().newInstance();
p.pause();
} catch (Exception e) {
e.printStackTrace();
}
}
}