Java 调用WebSphere8上的异步servlet会导致AsyncIllegalStateException

Java 调用WebSphere8上的异步servlet会导致AsyncIllegalStateException,java,asynchronous,servlet-3.0,websphere-8,Java,Asynchronous,Servlet 3.0,Websphere 8,我在调用servlet时遇到以下异常: 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

我在调用servlet时遇到以下异常:

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>

异步servlet
异步servlet
com.lala.lala.AsyncServlet
com.ibm.ws.webcontainer.async-supported
真的
异步servlet
/异步servlet

仍在获取AsyncIllegalStateException。您是如何让异步servlet在WAS8上运行的?

我在其中一个论坛上发现了类似的内容,也许这会有所帮助:

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();
        }
    }
}
}
import java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.AsyncContext;
导入javax.servlet.ServletException;
导入javax.servlet.ServletResponse;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns=“/AsyncServlet”,asyncSupported=true)
公共类AsyncServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
//记录servlet的线程
PrintWriter out=response.getWriter();
printf(“Servlet的线程:%s”,thread.currentThread());
out.flush();
//将请求置于异步模式
request.startAsync();
//通过Servlet3.0的抽象运行异步任务
AsyncContext asyncCtx=request.getAsyncContext();
MyTask mt=新的MyTask(异步CTX);
异步ctx.start(mt);
//通过java的抽象运行另一个异步任务
MyTask mt02=新的MyTask(异步CTX);
新线程(mt02).start();
printf(“Servlet完成其工作”);
}
公共类MyTask实现Runnable{
异步上下文异步上下文;
公共MyTask(异步上下文异步上下文){
this.asyncContext=asyncContext;
}
@凌驾
公开募捐{
ServletResponse=asyncContext.getResponse();
试一试{
//做这项耗时的工作
PrintWriter out=response.getWriter();
对于(int i=0;i<5;i++){
printf(“来自线程%s(%d)的Hello”,thread.currentThread(),i);
out.flush();
线程睡眠(1/*秒*/*1000);
}
}捕获(IOE异常){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}最后{
asyncContext.complete();
}
}
}
}

您收到的错误是因为在被调用的servlet之间必须有一些同步servlet或过滤器,请通过本异步servlet教程检查错误代码SRVE8010EGo