Error when init Atmosphere on Tomcat 7

Hi all,

my Vaadin 8 application (version 8.1.5) is throwing an exception when it executes on Tomcat 7 (version 7.0.69) - but apparently it still works.

SEVERE: Unable to load class {}. Please make sure you have properly installed Atmosphere http://goo.gl/KEi8pc java.lang.NoClassDefFoundError: org/apache/catalina/comet/CometEvent at org.atmosphere.container.Tomcat7CometSupport.<init>(Tomcat7CometSupport.java:62) at org.atmosphere.container.Tomcat7AsyncSupportWithWebSocket.<init>(Tomcat7AsyncSupportWithWebSocket.java:52) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:253) at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1457) at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1432) at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:878) at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:838) at com.vaadin.server.communication.PushRequestHandler.initAtmosphere(PushRequestHandler.java:216) at com.vaadin.server.communication.PushRequestHandler.<init>(PushRequestHandler.java:84) at com.vaadin.server.VaadinServletService.createRequestHandlers(VaadinServletService.java:53) at com.vaadin.server.VaadinService.init(VaadinService.java:196) at com.vaadin.server.VaadinServlet.createServletService(VaadinServlet.java:334) at com.vaadin.server.VaadinServlet.init(VaadinServlet.java:228) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1282) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1195) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:866) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 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) Does anyone have experienced the same situation? I believe that it is related to my web.xml configuration:

<context-param>
    <param-name>productionMode</param-name>
    <param-value>false</param-value>
</context-param>

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    <init-param>
        <param-name>UI</param-name>
        <param-value>com.example.MyUI</param-value>
    </init-param>
    <init-param>
        <param-name>widgetset</param-name>
        <param-value>AppWidgetset</param-value>
    </init-param>
    <init-param>
        <param-name>org.atmosphere.cpr.asyncSupport</param-name>
        <param-value>org.atmosphere.container.Tomcat7AsyncSupportWithWebSocket</param-value>
    </init-param>
    <async-supported>true</async-supported>
</servlet>

<session-config>
    <session-timeout>10000</session-timeout>
</session-config>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/vaadin/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>

Hi Felipe,

You have “async-supported” set to true. Did you try to run the app withouth the “org.atmosphere.cpr.asyncSupport” init-param in your web.xml?

BR,
Goran

I’d strongly recommend upgrading to a more recent version of Tomcat, if possible, especially since you’re using Push - the WebSockets support has been completely rewritten in Tomcat 8 and there are lots of bugfixes in there.

Best regards,

Olli

Hi Olli, in my case it’s not viable, because this is our client’s environment and they don’t aim to change that soon.

I read something about putting an atmosphere compatibility jar to Tomcat 7.

<dependency> <groupId>org.atmosphere</groupId> <artifactId>atmosphere-compat-tomcat7</artifactId> <version>2.0.1</version> </dependency> Do you know something about it? I’ll try it now and after I will post the result.

Hi Goran, yes I did, but it doens’t worked. As I said to Olli, I’ll put that tomcat7 compatibility jar just to give it a try.

Hey Guys,

with the compatibility library (
atmosphere-compat-tomcat7
) the error stopped occuring.

PS: atmosphere’s official website has some recommendations about compatibility with different servers. Follow the link for reference:
https://github.com/Atmosphere/atmosphere/wiki/Installing-AtmosphereServlet-with-or-without-native-support

Thank so much for your support!

Great to hear you got it working! The compatibility library does sound like the right way to go.

-Olli