2013-02-14 187 views
5
8個結果在WebSphere異步的servlet

我得到以下異常在調用一個servlet:呼叫在AsyncIllegalStateException

com.ibm.ws.webcontainer.async.AsyncIllegalStateException: SRVE8010E: The current request does not support asynchronous servlet processing. 

該servlet看起來是這樣的:

public class AsyncServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 

     try { 
      AsyncContext async = req.startAsync(); 
      async.start(new Runnable(){ 
       @Override 
       public void run() { 
       System.out.println("Bazinga"); 
       } 
      }); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 

    } 
} 

我試着使用註釋將其設置爲異步:

@WebServlet(urlPatterns = "/asyncServlet", asyncSupported = true) 

而且在web.xml中閱讀我的帖子後論壇:

<servlet> 
    <display-name>AsyncServlet</display-name> 
    <servlet-name>AsyncServlet</servlet-name> 
    <servlet-class>com.lala.lala.AsyncServlet</servlet-class> 
    <init-param> 
     <param-name>com.ibm.ws.webcontainer.async-supported</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>AsyncServlet</servlet-name> 
    <url-pattern>/asyncServlet</url-pattern> 
</servlet-mapping> 

仍然收到AsyncIllegalStateException。你是如何在WAS8上運行異步servlet的?

+1

您收到的錯誤怎麼一回事,因爲必須有一些同步servlet或您的調用者之間過濾器servlet http://pic.dhe.ibm.com/infocenter/wasinfo/v8r5/index.jsp?topic=/com.ibm.websphere.messages.doc/com.ibm.ws.webcontainer.resources.Messages.html check爲您的錯誤代碼SRVE8010E – Meherzad 2013-02-18 06:19:45

+0

通過本教程的異步servlet http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/async-servlet/async-servlets.html – Meherzad 2013-02-18 06:21:17

回答

2

我發現在論壇上的一個類似的東西,也許這將有助於:

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.AsyncContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(urlPatterns = "/AsyncServlet", asyncSupported = true) 
public class AsyncServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 


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

    // Record the servlet's thread 
    PrintWriter out = response.getWriter(); 
    out.printf("<h3>Servlet's thread: %s</h3>", Thread.currentThread()); 
    out.flush(); 

    // Put the request into asynchronous mode 
    request.startAsync(); 

    // Run an asynchronous task via servlet 3.0's abstractions 
    AsyncContext asyncCtx = request.getAsyncContext(); 
    MyTask mt = new MyTask(asyncCtx); 
    asyncCtx.start(mt); 

    // Run another asynchronous task via java's abstractions 
    MyTask mt02 = new MyTask(asyncCtx); 
    new Thread(mt02).start(); 

    out.printf("<h3>Servlet finishes its job</h3>"); 
} 

public class MyTask implements Runnable { 

    AsyncContext asyncContext; 

    public MyTask(AsyncContext asyncContext) { 
     this.asyncContext = asyncContext; 
    } 

    @Override 
    public void run() { 
     ServletResponse response = asyncContext.getResponse(); 
     try { 
      // do the time-consuming job 
      PrintWriter out = response.getWriter(); 
      for (int i = 0; i < 5; i++) { 
       out.printf("<h2>Hello from thread: %s (%d)</h2>", Thread.currentThread(), i); 
       out.flush(); 
       Thread.sleep(1 /* secs */ * 1000); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } finally { 
      asyncContext.complete(); 
     } 
    } 
} 
} 

found here