GracefulShutdownUndertow.java 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.medipath.cif.configurer.springbootshutdown;
  2. /**
  3. * @Author: lxk
  4. * @Date: 2019/11/29 15:08
  5. * @Version 1.0
  6. */
  7. import io.undertow.Undertow;
  8. import io.undertow.server.ConnectorStatistics;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.boot.web.embedded.undertow.UndertowServletWebServer;
  11. import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
  12. import org.springframework.context.ApplicationListener;
  13. import org.springframework.context.event.ContextClosedEvent;
  14. import org.springframework.stereotype.Component;
  15. import java.lang.reflect.Field;
  16. import java.util.List;
  17. /**
  18. *
  19. * 优雅关闭 Spring Boot undertow
  20. */
  21. @Component
  22. public class GracefulShutdownUndertow implements ApplicationListener<ContextClosedEvent> {
  23. @Autowired
  24. private GracefulShutdownUndertowWrapper gracefulShutdownUndertowWrapper;
  25. @Autowired(required = false)
  26. private ServletWebServerApplicationContext context;
  27. @Override
  28. public void onApplicationEvent(ContextClosedEvent contextClosedEvent){
  29. gracefulShutdownUndertowWrapper.getGracefulShutdownHandler().shutdown();
  30. try {
  31. UndertowServletWebServer webServer = (UndertowServletWebServer)context.getWebServer();
  32. Field field = webServer.getClass().getDeclaredField("undertow");
  33. field.setAccessible(true);
  34. Undertow undertow = (Undertow) field.get(webServer);
  35. List<Undertow.ListenerInfo> listenerInfo = undertow.getListenerInfo();
  36. Undertow.ListenerInfo listener = listenerInfo.get(0);
  37. ConnectorStatistics connectorStatistics = listener.getConnectorStatistics();
  38. while (connectorStatistics.getActiveConnections() > 0){}
  39. }catch (Exception e){
  40. // Application Shutdown
  41. }
  42. }
  43. }