According to Servlet Specification Version 3.1, request.isAsyncStarted() should 
return false after calling asyncContext.dispatch().request.isAsyncStarted() 
return false in weblogic, but true in tomcat. Is tomcat's action right?


Java™ Servlet Specification Version 3.1------------------------------2.3.3.3 
Asynchronous processing

    ServletRequest

    ■ public boolean isAsyncStarted() - Returns true if async processing has 
    started on this request, and false otherwise. If this request has been 
    dispatched using one of the AsyncContext.dispatch methods since it was put 
    in asynchronous mode, or a call to AsynContext.complete is made, this 
    method returns false.
test envirment:------------------------------Tomcat 9.0.55
weblogic 12.2.1.4.0
JDK 1.8.0_261

test code:
------------------------------
import java.io.IOException;

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

@WebServlet(value = "/test", asyncSupported = true)
public class SimpleIssueServlet extends HttpServlet {

    private static final long serialVersionUID = -2504425408734161943L;

    private static final String CTX_RESULT = "CTX_RESULT";
 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse 
response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse 
response)
            throws ServletException, IOException {

        String result = (String) request.getAttribute(CTX_RESULT);

        if (result != null) {
            response.getWriter().write(result);

            return;
        }

        AsyncContext asyncContext = request.startAsync();

        boolean isAsyncStarted01 = request.isAsyncStarted();
        System.out.println("isAsyncStarted01:" + isAsyncStarted01);
        // tomcat: isAsyncStarted01 = true; 
        // weblogic: isAsyncStarted01 = true;

        {
            // make result
            String ret = "this is a test";

            request.setAttribute(CTX_RESULT, ret);

            asyncContext.dispatch();
        }

        boolean isAsyncStarted02 = request.isAsyncStarted();
        System.out.println("isAsyncStarted02:" + isAsyncStarted02);
        // tomcat: isAsyncStarted02 = true; 
        // weblogic: isAsyncStarted02 = false;
    }
}

Reply via email to