2016-08-14 65 views
2

我試圖在嵌入式jetty容器中製作簡單的servlet。 這是我的碼頭配置:嵌入式碼頭。 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(); 
    } 
    } 
} 

我添加了一個簡單的servlet,什麼也不做。只是寫了一些字符串響應:

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(); 
    }