Vaadin Push IllegalStateException "not support asynchronous operations"

Hi All,

I know there are similar posts about this issue, but nothing that has been recommended is working for us.

We have a Vaadin application in production that is running:

Tomcat 7.0.57
Java 1.8.0_20-b26
Vaadin 7.3.8

Customer uses:
Google Chrome 39.0.2171.95M

We have a vaadin application that uses push. We are currently getting the following exception.

[code]
Jan 09, 2015 12:52:46 PM org.atmosphere.cpr.AtmosphereFramework doCometSupport

SEVERE: AtmosphereFramework exception

java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations.

at org.apache.catalina.connector.Request.startAsync(Request.java:1658)

at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1029)

at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:385)

at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:385)

at org.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper.startAsync(HttpSessionSecurityContextRepository.java:246)

at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:385)

at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:678)

at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:93)

at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:68)

at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:67)

at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:98)

at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:62)

at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)

at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:144)

at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1406)

at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)

at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)

at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)

at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

Jan 09, 2015 12:52:46 PM com.vaadin.server.DefaultErrorHandler doDefault

SEVERE:

java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations.

at org.apache.catalina.connector.Request.startAsync(Request.java:1658)

at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1029)

at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:385)

at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:385)

at org.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper.startAsync(HttpSessionSecurityContextRepository.java:246)

at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:385)

at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:678)

at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:93)

at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:68)

at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:67)

at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:98)

at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:62)

at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)

at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:144)

at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1406)

at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)

at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)

at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)

at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

[/code]If I look at the startup of the application, I see in the tomcat logs:

INFO: Atmosphere is using async support: org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket running under container: Apache Tomcat/7.0.57 using javax.servlet/3.0

Jan 09, 2015 1:14:29 PM org.atmosphere.cpr.AtmosphereFramework info

INFO: Atmosphere Framework 2.1.2.vaadin6 started.

Jan 09, 2015 1:14:29 PM org.atmosphere.cpr.AtmosphereFramework interceptor

INFO: Installed AtmosphereInterceptor  Track Message Size Interceptor using | with priority BEFORE_DEFAULT 

It indicates there Atmosphere Framework 2.1.2.vaadin6 started. Is that correct? We are running Vaadin 7.

My development team is running chrome 39.0.2171.95 (64-bit). Does that make any difference?

Is there something that can be done to overcome this problem? What causes it?

Thanks,
Tom

Additionally, our web XML is:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>Vaadin Sample Application</servlet-name>
<servlet-class>ru.xpoft.vaadin.SpringVaadinServlet</servlet-class>
<init-param>
<param-name>beanName</param-name>
<param-value>dashboardUI</param-value>
</init-param>
<init-param>
<param-name>systemMessagesBeanName</param-name>
<param-value>DEFAULT</param-value>
</init-param>
<init-param>
<param-name>pushmode</param-name>
<param-value>automatic</param-value> </init-param>
<async-supported>true</async-supported>
</servlet>

Just to clarify, our development team doesn’t see this issue. We use 65-bit chrome on Mac. Customers are using chrome on Windows 7.

Thanks,
Tom

I fired up my Windows 7 VM and ran with the same Chrome version as my customer and everything is fine. So, that leads me to something environmental. Is there something that might interfere with Push? Antivirus? Anything else?

Thanks,
Tom

I think that’s your culprit. Or, like the exception says, something else that injects a request filter that does not support Servlet 3.0 asynchronous requests. If you can’t do anything about that, then I think you’ll have to configure Atmosphere to use lower-performance blocking push handling. Try setting the servlet init parameter “org.atmosphere.useBlocking” to value “true” (in web.xml or @WebServlet annotation, whichever you use.)