Jetty 9(嵌入式):在运行时添加处理程序

Jen*_*ers 4 java jetty embedded-jetty

有没有办法向正在运行的嵌入式Jetty实例添加处理程序?我们已将旧的基于Jetty 6的项目迁移到Jetty 9,我们需要为插件系统添加和删除动态处理程序......

见下面的例子......

Server server = new Server();
[...]
server.start();
[...]
Handler[] existingHandler = server.getHandlers();

// There is no more
server.addHandler(newHandler);

// only this you can do, but only if the server is stopped
server.setHandler(newHandler)
Run Code Online (Sandbox Code Playgroud)

注意:newHandlerHandlerCollection......

Jac*_*ler 9

这是一个完整的代码示例.在使用之后HandlerCollection(true),显式启动新的上下文处理程序也很重要.

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;

public class DynamicContextHandlers {
    public static void main(String[] args) throws Exception {
        new DynamicContextHandlers().run();
    }

    public void run() throws Exception {
        int port = 8080;
        Server server = new Server(port);

        ContextHandler contextHandler = new ContextHandler();
        contextHandler.setContextPath("/hello");
        contextHandler.setResourceBase(".");
        contextHandler.setClassLoader(Thread.currentThread().getContextClassLoader());
        contextHandler.setHandler(new HelloHandler(""));

        HandlerCollection contextHandlerCollection = new HandlerCollection(true); // important! use parameter
                                                                                    // mutableWhenRunning==true

        // add context handler before starting server (started implicitly)
        contextHandlerCollection.addHandler(contextHandler);
        server.setHandler(contextHandlerCollection);

        server.start();
        System.out.println("Server started at port " + port + " with context handler for /hello");

        System.out.println("Press enter to add context handler for /hello2");
        System.in.read();

        ContextHandler contextHandler2 = new ContextHandler();
        contextHandler2.setContextPath("/hello2");
        contextHandler2.setResourceBase(".");
        contextHandler2.setClassLoader(Thread.currentThread().getContextClassLoader());
        contextHandler2.setHandler(new HelloHandler("2"));

        // add handler after starting server.
        contextHandlerCollection.addHandler(contextHandler2);
        // important! start context explicitly.
        contextHandler2.start();

        System.out.println("Press enter to exit.");
        System.in.read();

        server.stop();

    }

    public class HelloHandler extends AbstractHandler {
        String string;

        public HelloHandler(String string) {
            this.string = string;
        }

        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
                throws IOException, ServletException {
            response.setContentType("text/html;charset=utf-8");
            response.setStatus(HttpServletResponse.SC_OK);
            baseRequest.setHandled(true);
            response.getWriter().println("<h1>Hello World" + string + "</h1>");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Joa*_*elt 7

使用Jetty 9.1.0.v20131115,您可以mutableWhenRunningHandlerCollection构造函数上使用标志...

HandlerCollection coll = new HandlerCollection(true);
Run Code Online (Sandbox Code Playgroud)

这将忽略isStarted()在集合本身的测试.setHandlers(Handlers[]).addHandler(Handler)调用.

此行为是仅适用于HandlerCollection本身,还可以增加个人的处理程序,或将整个处理程序树而不考虑到LifeCycleHandlerCollection.

例如:

Server server = new Server(8080);
HandlerCollection myhandlers = new HandlerCollection(true);
server.setHandler(myhandlers);

// add some initial handlers
myhandlers.setHandlers(new Handlers[] { helloHandler, indexHandler });

// start server
server.start();

// ... at some point later, during runtime
FooHandler fooHandler = new FooHandler();
fooHandler.start();
myhandlers.addHandler(fooHandler);

BarHandler barHandler = new BarHandler();
barHandler.start();
myhandlers.addHandler(barHandler);
Run Code Online (Sandbox Code Playgroud)