如何将钩子注册到Jetty启动生命周期?



我试图在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.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)添加到特定容器组件的bean。

然后是专门的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);
}
}
}

最新更新