Vaadin 7.2.1 and Tomcat 8 Websocket status

Hi everybody,

I was very excited to see that Vaadin 7.2 now has support for Tomcat 8 and from what I understand this should also include push support via websockts. I was however very dissapointed that everytime a resolved an issue one or two more popped up. I finally managed to get my vaadin application running however one issue remains that I cannot resolve, therefor I hope that somebody of you can point me in the right direction.

First of all atmosphere was throwing errors telling me that it couldn’t find some Jetty related AsyncPush class or so. Turns out, that I had a jetty-server dependency somewhere hidden by another dependency, yet this error message never came up with Tomcat 7.

Now, using more or less the same setup as with Tomcat 7 (where everything works flawlessly) I get errors like this:

Jun 02, 2014 4:45:24 PM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE: 
java.lang.IllegalStateException: Not supported.
    at org.apache.catalina.connector.Request.startAsync(Request.java:1604)
    at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1037)
    at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:384)
    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.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)
    at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:143)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1405)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:78)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1033)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2451)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2440)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

Jun 02, 2014 4:45:24 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [WebMasterServlet]
 in context with path 
[/mycontext] threw exception [com.vaadin.server.ServiceException: java.lang.IllegalStateException: Not supported.]
 with root cause
java.lang.IllegalStateException: Not supported.
    at org.apache.catalina.connector.Request.startAsync(Request.java:1604)
    at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1037)
    at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:384)
    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.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)
    at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:143)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1405)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:78)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1033)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2451)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2440)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

I then added true to my web.xml which now brings up these error messages:

On the Client debug dialog:

Push connection using primary method (websocket) failed. Trying with long-polling 1781msPush connection established using long-polling 9808msVariable burst to be sent to server: 9809ms 155 (class org.tepi.filtertable.gwt.client.ui.FilterTableConnector) : 9809ms v.v(pagelength : 28) 9810ms 170 (class com.vaadin.client.ui.table.TableConnector) : 9810ms v.v(pagelength : 12) 9810ms 131 (class com.vaadin.client.ui.ui.UIConnector) : 9811ms com.vaadin.shared.ui.ui.UIServerRpc.resize([976, 1920, 1920, 976] ) 9811ms 137 (class com.vaadin.client.ui.nativebutton.NativeButtonConnector) : 9812ms com.vaadin.shared.ui.button.ButtonServerRpc.click([LEFT,189,23,false,false,false,false,1,62,23] ) 9817msMaking UIDL Request with params: {"csrfToken":"f3666cdf-b34a-4d5a-a461-91eb710f39a1", "rpc":[["155","v","v",["pagelength",["i","28"] ]],["170","v","v",["pagelength",["i","12"] ]],["131","com.vaadin.shared.ui.ui.UIServerRpc","resize",["976","1920","1920","976"] ],["137","com.vaadin.shared.ui.button.ButtonServerRpc","click",[{"ctrlKey":false, "clientY":"23", "clientX":"189", "type":"1", "relativeY":"23", "relativeX":"62", "shiftKey":false, "metaKey":false, "button":"LEFT", "altKey":false}] ]], "syncId":1} 9818msSending push message: {"csrfToken":"f3666cdf-b..... And on the server side dozens of these messages:

Jun 02, 2014 4:40:24 PM com.vaadin.server.communication.PushHandler$2 run WARNING: Invalid CSRF token in new connection received from 127.0.0.1 I’m using Tomcat 8.0.8 and have all the default settings. To enable push support in vaadin I just use a simple @Push annotation in my UI class. I have recompiled all my widgetsets and confirmed that versions match in the debug dialog so thats definitely not the issue.

I very much appreciate your help!

Bump, anyone?

Hi, I tested this by creating a new project in Eclipse (Vaadin 7.2.2), added @Push, exported as a war and deployed it to Tomcat 8.0.8. Everything seems to work nicely with websockets, both with Chrome and Firefox - did you do something differently?

I received the same, but in both Tomcat 7 and 8.0.8. The big change was upgrading from 7.1 to 7.2.2. I have two seperate Vaadin projects, and both experienced the same problem after upgrading to 7.2.2. One is on Tomcat 7 and the other in 8. Another thing I noticed is that performance is a lot slower after upgrading, but I’m suspecting it’s related to the repetative stack trace found in the logs:

SEVERE:

java.lang.IllegalStateException: Not supported.
at org.apache.catalina.connector.Request.startAsync(Request.java:1604)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1037)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:384)
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.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)
at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:143)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1405)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.wisdom.glic.data.LazyHibernateServletFilter.doFilter(LazyHibernateServletFilter.java:30)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:615)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:78)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:794)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

java.lang.IllegalStateException: Not supported.
at org.apache.catalina.connector.Request.startAsync(Request.java:1604)

means that you do not have
true
set for your application

Hiya, thanks for the response Artur. I’m not using a web.xml file in my application because I’m using servlet 3.0 annotations:

[code]
@WebServlet(urlPatterns = { “/ui/", "/VAADIN/” }, loadOnStartup = 2, asyncSupported = true, initParams = { @WebInitParam(name = “org.atmosphere.cpr.broadcasterCacheClass”, value = “org.atmosphere.cache.UUIDBroadcasterCache”) })

@ServletSecurity(value = @HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL))

@VaadinServletConfiguration(ui = GlicUI.class, widgetset = "com.wisdom.glic.AppWidgetSet", productionMode = false)

[/code]One thing I’m thinking of … I haven’t been able to reproduce the same problem in development, but it happens consistently in production only when using 7.2.x libraries. The code and app server are identical in dev and prod, but the main difference (other than data) is that the app server (Tomcat) is running behind an Apache webserver via AJP proxy while dev is not. Can’t test that at the moment, but could that affect the PUSH requests sent to Vaadin?

Cheers,
Tristan

To follow up on my previous comment, I checked with the standard Tomcat port to bypass the Apache Web server proxy and I don’t see the problem there and performance is faster so in my scenario the problem is not with Tomcat 7 or 8 nor Vaadin, but with how PUSH works when behind a proxy. I’ve quickly checked and I see that others are having the same problem and some go with stating to avoid putting atmosphere/vaadin behind a proxy if one wants to use push. If it needs to be behind a proxy then the recommendation seems to use long polling instead for Vaadin 7.2.x

Turns out my issues were related to having multiple servlet-mappings to the same servlet. As soon as I removed the second mapping, everything works just fine!