2014-03-02 39 views
1

我使用地鐵2.3.1-b104與Tomcat 7.0.28和所有工作沒有問題。但是,切換到Tomcat 8.0.3時,每次調用Web服務時都會收到以下警告(即使它們仍然可用)。我看到下面的警告:警告與Tomcat 8和Glassfish地鐵

WARNING: onComplete() failed for listener of type 

[org.apache.catalina.core.AsyncListenerWrapper] 
java.lang.IllegalStateException: It is illegal to call getRequest() after complete() or any of the dispatch() methods has been called 
    at org.apache.catalina.core.AsyncContextImpl.getRequest(AsyncContextImpl.java:213) 
    at com.sun.xml.ws.transport.http.servlet.WSAsyncListener$1.onComplete(WSAsyncListener.java:69) 
    at org.apache.catalina.core.AsyncListenerWrapper.fireOnComplete(AsyncListenerWrapper.java:35) 
    at org.apache.catalina.core.AsyncContextImpl.fireOnComplete(AsyncContextImpl.java:100) 
    at org.apache.coyote.AsyncStateMachine.asyncPostProcess(AsyncStateMachine.java:206) 
    at org.apache.coyote.AbstractProcessor.asyncPostProcess(AbstractProcessor.java:136) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:656) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

任何建議上:

  1. 它是一個Tomcat或地鐵?
  2. 根本原因是什麼?
  3. 如何解決?
+1

我與Tomcat 8.0.5沒有使用地鐵(目前在一個Vaadin應用程序)完全相同的異常,所以我想它是有關Tomcat配置。 – Mathieu

回答

0

當你在AsyncContext上調用start()時,你給它一個Runnable的實現。在Runnable中的finally子句中的AsyncContext上調用complete()。敵人的例子:

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException{ 

AsyncContext aContext = request.startAsync(); 

    //Provide Runnable implementation to start method 
    aContext.start(() ->{ 

    try{ 

     PrintWriter out; 
     try { 
      Thread.currentThread().sleep(3000); // Emulate a 3-second process 

      HttpServletResponse resp = (HttpServletResponse) aContext.getResponse(); 
      out = resp.getWriter(); 
      out.println("Hello from Async servlet"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }catch(InterruptedException e){ 
     e.printStackTrace(); 
    }finally{ 
     aContext.complete(); // close the response obj   
    } 

    }); 

} 
+0

他指的是Web服務,您的解決方案更多地與Web Servlets相關。 –