2016-08-14 187 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(); 
    }