2013-11-18 5 views
3

Есть ли способ добавить обработчики к запущенному экземпляру Jetty? Мы мигрировали проект на основе старого Jetty 6 до 9 Jetty и нам нужно для нашей системы плагинов возможность добавлять и удалять динамически обработчики ...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) 

Примечание: newHandler это HandlerCollection ...

+0

Есть ли у вас, или использовать, что-то в ваших обработчиков, которые подлежат Jetty [LifeCycle] (http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty /util/component/LifeCycle.html) (что все обработчики Jetty являются частью)? –

+1

Конечно, они являются частью ... Проблема заключается в наборе серверов setHandler Method, они запускают новое IllegalStateException («НАЧАЛО»), если сервер запущен. Может быть, по уважительной причине, поэтому я не знаю, как справиться с этим. Я знаю, что есть DeplomentManager, но я не нашел расширенного примера. Те, кто на документации по причалу, показывают только, как обрабатывать один контекст ресурса с ним. –

ответ

5

с Jetty 9.1.0.v20131115 вы можете использовать mutableWhenRunning флаг HandlerCollection конструктора ...

HandlerCollection coll = new HandlerCollection(true); 

Это будет игнорировать тесты isStarted() самой коллекции при звонках .setHandlers(Handlers[]) и .addHandler(Handler).

Это поведение доступно только для пользователя HandlerCollection, вы можете добавить отдельные обработчики или установить дерево всего обработчика без учета LifeCycle из HandlerCollection.

Например:

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); 
+0

Извините, что флаг уже установлен, но setHandler объекта сервера не волнует. Только моя используемая коллекция обработчиков заботится об этом, и я могу добавить новые. Но добавленный обработчик/контексты, похоже, не развертываются? Как справиться с этим в Jetty 9? В Jetty 6 мы просто вызываем addHandler на сервере ... –

+0

Обновление OK до 9.1 работает, теперь мои контексты доступны/могут быть добавлены во время выполнения! –

+0

Пожалуйста, расскажите, как вы это сделали! В противном случае ваш комментарий бесполезен. –

5

Здесь полный образец кода. Рядом с использованием 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>"); 
     } 
    } 
} 
Смежные вопросы