如何将挂钩注册到 Jetty Startup Lifecycle 中?

How to register hooks into Jetty Startup Lifecycle?

我正在尝试 运行 Jetty 服务器启动和停止之前的一段代码。

启动我的服务器的配置与此类似:

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.start();
        server.join();
    }
}

我不确定我需要配置哪个 Jetty 组件才能插入到生命周期中。

我该怎么做?

最基本的是 LifeCycle.Listener,当添加到 LifeCycle 中支持 LifeCycle 的组件时,它会向您自己的侦听器报告状态更改。

这只会报告您在 LifeCycle.addListener(LifeCycle.Listener) 上使用过的那个组件。

示例:

package jetty;

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.component.LifeCycle;

public class LifeCycleListenerDemo
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server();
        server.addLifeCycleListener(new CustomLifeCycleListener());
        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.start();
        server.join();
    }

    public static class CustomLifeCycleListener implements LifeCycle.Listener
    {
        @Override
        public void lifeCycleStarting(LifeCycle event)
        {
            System.out.println("Starting: " + event);
        }

        @Override
        public void lifeCycleStarted(LifeCycle event)
        {
            System.out.println("Started: " + event);
        }

        @Override
        public void lifeCycleFailure(LifeCycle event, Throwable cause)
        {
            System.out.println("Failure: " + event);
            cause.printStackTrace(System.out);
        }

        @Override
        public void lifeCycleStopping(LifeCycle event)
        {
            System.out.println("Stopping: " + event);
        }

        @Override
        public void lifeCycleStopped(LifeCycle event)
        {
            System.out.println("Stopped: " + event);
        }
    }
}

还有一个 Container.Listener 会告诉您有关通过 ContainerLifeCycle.addEventListener(Container.Listener) 添加到特定容器组件的 beans。

然后是专门的 Container.InheritedListener,它会将您的 Container.InheritedListener 传播到容器的所有子 bean(嵌套)。

您可以使用它来添加自定义 LifeCycle.Listener 所有已注册的 bean。

示例:

package jetty;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.component.Container;
import org.eclipse.jetty.util.component.LifeCycle;

public class LifeCycleNestedListenerDemo
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server();
        CustomLifeCycleListener lifeCycleListener = new CustomLifeCycleListener();
        server.addEventListener(lifeCycleListener);
        lifeCycleListener.addListener(server); // so we can see server/starting event
        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.start();
        server.join();
    }

    public static class CustomLifeCycleListener implements Container.InheritedListener, LifeCycle.Listener
    {
        private Set<Integer> addedObjects = new HashSet<>();

        public void addListener(LifeCycle lifeCycle)
        {
            // identify what we've added the listener too already, so we don't add it multiple times
            int identityHashCode = System.identityHashCode(lifeCycle);
            if (!addedObjects.contains(identityHashCode))
            {
                lifeCycle.addLifeCycleListener(this);
                addedObjects.add(identityHashCode);
            }
        }

        @Override
        public void beanAdded(Container parent, Object child)
        {
            System.out.printf("beanAdded(%s, %s)%n", parent.getClass().getName(), child.getClass().getName());
            if (child instanceof LifeCycle)
            {
                LifeCycle lifeCycle = (LifeCycle)child;
                addListener(lifeCycle);
            }
        }

        @Override
        public void beanRemoved(Container parent, Object child)
        {

        }

        @Override
        public void lifeCycleStarting(LifeCycle event)
        {
            System.out.println("Starting: " + event);
        }

        @Override
        public void lifeCycleStarted(LifeCycle event)
        {
            System.out.println("Started: " + event);
        }

        @Override
        public void lifeCycleFailure(LifeCycle event, Throwable cause)
        {
            System.out.println("Failure: " + event);
            cause.printStackTrace(System.out);
        }

        @Override
        public void lifeCycleStopping(LifeCycle event)
        {
            System.out.println("Stopping: " + event);
        }

        @Override
        public void lifeCycleStopped(LifeCycle event)
        {
            System.out.println("Stopped: " + event);
        }
    }
}