如何在Jetty启动生命周期中注册钩子,在服务启停前后执行自定义代码
Jetty插入启动前/停止前自定义逻辑的实现方法
Jetty的核心服务组件均实现了LifeCycle接口,天然支持通过注册生命周期监听器的方式插入自定义回调逻辑,无需改动原有启动流程的核心结构。
具体实现步骤
你只需要给Server实例注册LifeCycle.Listener监听器,重写对应回调方法即可:
lifeCycleStarting方法:在Jetty服务器正式启动前触发,可写入启动前要执行的自定义代码lifeCycleStopping方法:在Jetty服务器正式停止前触发,可写入停止前要执行的自定义代码
修改后的完整代码如下:
import org.eclipse.jetty.util.component.LifeCycle; public class ExampleServer { public static void main(String[] args) throws Exception { Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(8080); server.setConnectors(new Connector[] { connector }); ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/hello"); context.addServlet(HelloServlet.class, "/"); HandlerCollection handlers = new HandlerCollection(); handlers.setHandlers(new Handler[] { context, new DefaultHandler() }); server.setHandler(handlers); // 注册生命周期监听器插入自定义逻辑 server.addLifeCycleListener(new LifeCycle.Listener() { @Override public void lifeCycleStarting(LifeCycle event) { // 此处写入服务器启动前要执行的自定义代码 System.out.println("Jetty即将启动,执行前置逻辑"); } @Override public void lifeCycleStopping(LifeCycle event) { // 此处写入服务器停止前要执行的自定义代码 System.out.println("Jetty即将停止,执行前置逻辑"); } }); server.start(); server.join(); } }
注意事项
- 如果启动前的自定义逻辑抛出异常,会直接终止Jetty的启动流程,适合用于配置校验、基础资源初始化这类前置校验操作
- 停止前的自定义逻辑不要执行过长耗时操作,Jetty默认的停止超时为30秒,超时后会强制终止进程
- 如果你需要插入的是Servlet上下文级别的启停逻辑,也可以给
ServletContextHandler注册监听器,触发时机对应上下文的启停周期,和Server级别的监听器互相独立
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

