2016-08-14 4 views
2

Я пытаюсь сделать простой сервлет во встроенном контейнере причала. Это моя конфигурация молы:Встроенный причал. java.lang.IllegalStateException:! STOPPED

public class Application { 
    public static void main(String[] args) throws Exception { 
    //-Dport=8188 
    int port = 8188; 
    if(System.getProperty("port") != null) { 
     port = Integer.valueOf(System.getProperty("port")); 
    } 

    //-Dhost="127.0.0.1" 
    String host = System.getProperty("host"); 
    if(host == null || host.isEmpty()) { 
     host = "127.0.0.1"; 
    } 

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath("/"); 

    InetAddress address = InetAddress.getByName(host); 
    InetSocketAddress socketAddress = new InetSocketAddress(address, port); 

    Server jettyServer = new Server(socketAddress); 
    jettyServer.setHandler(context); 

    ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*"); 
    jerseyServlet.setInitOrder(0); 

    // Initializing servlet 
    jerseyServlet.setInitParameter(
     "jersey.config.server.provider.classnames", 
     Proxy.class.getCanonicalName() 
    ); 

    try { 
     jettyServer.start(); 
     jettyServer.join(); 
    } finally { 
     jettyServer.destroy(); 
    } 
    } 
} 

добавить простейший сервлет, который ничего не делает. Просто написал некоторые строки в ответ:

public class Proxy extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     doRequest(request, response); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     doRequest(request, response); 
    } 

    private void doRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     PrintWriter writer = response.getWriter(); 
     writer.println("GOT IT!"); 
    } 
} 

Когда я начинаю, я получаю сообщение об ошибке:

2016-08-14 10:53:42.338:INFO::main: Logging initialized @110ms 
2016-08-14 10:53:47.404:INFO:oejs.Server:main: jetty-9.3.z-SNAPSHOT 
2016-08-14 10:53:47.923:INFO:oejsh.ContextHandler:main: Started [email protected]{/,null,AVAILABLE} 
Exception in thread "main" java.lang.IllegalStateException: !STOPPED 
    at org.eclipse.jetty.server.handler.HandlerWrapper.destroy(HandlerWrapper.java:135) 
    at ru.gridr.Application.main(Application.java:50) 

Где ошибка? Может ли кто-нибудь показать простой пример?

ответ

6

Когда вы делаете jettyServer.destroy(), вы захотите, чтобы уничтожить

the managed Destroyable beans in the reverse order they were added

И этот код выполняется, как только сервер завершит свое начало:

jettyServer.join(); 

Таким образом, вы должны удалить блок:

finally { 
     jettyServer.destroy(); 
    } 

, потому что я предполагаю, что вы хотите, чтобы ваш сервер продолжал работать после его запуск.

Я думаю, из сообщения

Exception in thread "main" java.lang.IllegalStateException: !STOPPED

, что вы должны использовать jettyServer.destroy() только после его остановки, и я полагаю, в двух случаях:

  • , если происходит любое исключение при запуске сервера.
  • если вы намеренно остановили сервер.

При возникновении исключения во время запуска сервера, вы можете попробовать что-то вроде этого:

try { 
     jettyServer.start(); 
     jettyServer.join(); 
    } catch (Exception e){ 
     logger.errror("error during server starting",e) 
     jettyServer.stop(); 
     jettyServer.destroy(); 
    } 
Смежные вопросы