Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-dev] Calling startAsync() on a servlet request throws java.lang.IllegalStateException: s=DISPATCHED i=true a=STARTED

Hi Simone,

 

> The real question is: why you call startAsync() in your filter and then chain to the ProxyServlet?

 

Using AsyncListener, I want to wait for the "completion" of the requests whose URLs are mapped to my filter, so that I can perform some specific operations in the AsyncListener's onComplete() method. For example, if the request to create a search object in Kibana is completed, I want to create a new object in my application and also generate an audit event.

 

Anyway, I fixed the IllegalStateException as follows:

1.      The listener related code segment was located BEFORE the filter’s “chain.doFilter()” call. I moved this code segment to a position AFTER the filter’s "chain.doFilter()" call, so that I can retrieve the AsyncContext that is "already created" in the Jetty ProxyServlet's service() method. I can then add an AsyncListener to the retrieved AsyncContext.

2.      I changed the “request.startAsync()” call in my filter to “request.getAsyncContext()” so that I am not starting a new AsyncContext which leads to the IllegalStateException, but only retrieving the AsyncContext that is already created in Jetty’s ProxyServlet.

 

So the updated code segment looks like this:

 

               chain.doFilter(myRequestWrapper, response);

                AsyncContext asyncContext = myRequestWrapper.getAsyncContext();

                asyncContext.addListener(new AsyncListener() {

                                                           

                                                            @Override

                                                            public void onTimeout(AsyncEvent event) throws IOException

                                                            {

                                                                        logger.log(Level.WARNING, "Async timeout...");

                                                            }

                                                           

                                                            @Override

                                                            public void onStartAsync(AsyncEvent event) throws IOException

                                                            {

                                                                        logger.log(Level.INFO, "Async start...");

                                                            }

                                                           

                                                            @Override

                                                            public void onError(AsyncEvent event) throws IOException

                                                            {

                                                                        logger.log(Level.SEVERE, "Async error...");

                                                            }

                                                           

                                                            @Override

                                                            public void onComplete(AsyncEvent event) throws IOException

                                                            {

                                                                                      HttpServletResponse httpResponse = (HttpServletResponse) event.getSuppliedResponse();

                                                                                     //HttpServletResponse httpResponse = (HttpServletResponse) event.getAsyncContext().getResponse();

                                                                                    if (httpResponse.getStatus() == HttpServletResponse.SC_OK || httpResponse.getStatus() == HttpServletResponse.SC_CREATED ) {

                                                                                                //some business logic

                                                                                    }

                                                            }

                                                }, myRequestWrapper, httpServletResponse);

 

Thanks a lot for your response…

 

Regards,

Sanjay

 

----------------------------------------------------------------------

Date: Tue, 21 Feb 2017 23:14:37 +0100

From: Simone Bordet <sbordet@xxxxxxxxxxx>

To: "Jetty @ Eclipse developer discussion list"

               <jetty-dev@xxxxxxxxxxx>

Subject: Re: [jetty-dev] Calling startAsync() on a servlet request

               throws java.lang.IllegalStateException: s=DISPATCHED i=true a=STARTED

Message-ID:

               <CAFWmRJ0OrqcF7tQOi2OsyfZxwUfY67QQ-HAP0qC0FXf5_K+RJA@xxxxxxxxxxxxxx>

Content-Type: text/plain; charset=UTF-8

 

Hi,

 

On Tue, Feb 21, 2017 at 6:47 PM, Sanjay Bhat <Sanjay.Bhat@xxxxxxxxxxxxxx> wrote:

> Is the "IllegalStateException" being thrown because the startAsync()

> method is being called twice on the same request - for the first time

> in my filter and for the second time in Jetty ProxyServlet's service() method?

 

Yes.

 

> If yes, is there no way to use an "AsyncListener" in a filter chain

> that is terminated by Jetty's ProxyServlet?

 

Multiple startAsync() calls are supported by the Servlet Spec (and of course in Jetty), but only in consecutive cycles.

 

The real question is: why you call startAsync() in your filter and then chain to the ProxyServlet ?

 

--

Simone Bordet

----

http://cometd.org

http://webtide.com

Developer advice, training, services and support from the Jetty & CometD experts.

 

 

------------------------------


Back to the top