Hi Sergey, Aki,
My application seems to work under Tomcat 8 with the following modifications:
1) Add @ServerEndpoint(value = "/services") on my service class (named
UserService.java)
2) Add a method into this class with the annotation @OnMessage like:
@OnMessage
public String hello(String message) {
return "Hello!";
}
3) Add the following dependency in my pom.xml
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
With these changes, the sample almost works in both Tomcat version (7 and 8),
except that all websocket requests are routed to the method having @OnMessage
annotation :)
It seems it needs some configurations again :)
Hope this will help.
Best regards,
Anthony
-----Original Message-----
From: MULLER, Anthony [mailto:[email protected]]
Sent: jeudi 29 septembre 2016 15:18
To: [email protected]
Subject: RE: CXF 3.1 + Tomcat 8 + JAR-RS + Atmosphere + WebSocket
Hi Sergey,
Thanks very much, I deployed on Tomcat 7 and it works fine.
I will investigate deeper to try to understand what's going on with Tomcat 8...
Regards,
Anthony
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: jeudi 29 septembre 2016 12:17
To: [email protected]
Subject: Re: CXF 3.1 + Tomcat 8 + JAR-RS + Atmosphere + WebSocket
Hi Anthony
Sorry it is my fault, I looked at the master source, not realizing 3.1.7
uses a different Atmosphere version (2.3.7).
I've run a websocket_web demo with a Tomcat 7 plugin and it works fine
for me. Can you confirm please this demo also works for you ?
Thanks, Sergey
On 29/09/16 08:47, MULLER, Anthony wrote:
> Hi Sergey,
>
> I made the recommended changes (upgrade Atmosphere and disable the async
> feature of CXFServlet), I got this error when trying to connect.
>
> Seems there is a mismatch between the used CXF version (3.1.7) and Atmosphere
> (2.4.3).
>
> Best regards,
> Anthony
>
>
> SEVERE: Servlet.service() for servlet [CXF Bootstrap] in context with path
> [/cxf31_websocket] threw exception [Servlet execution threw an exception]
> with root cause
> java.lang.NoSuchMethodError:
> org.atmosphere.cpr.AtmosphereRequest.wrap(Ljavax/servlet/http/HttpServletRequest;)Lorg/atmosphere/cpr/AtmosphereRequest;
> at
> org.apache.cxf.transport.websocket.atmosphere.AtmosphereWebSocketServletDestination.invoke(AtmosphereWebSocketServletDestination.java:73)
> at
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
> at
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
> at
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
> at
> org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:180)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:299)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:223)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:274)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
> at
> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
> at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
> at
> org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
> at
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
> at
> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
> at
> org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
> at
> org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
> 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)
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:[email protected]]
> Sent: mercredi 28 septembre 2016 17:54
> To: [email protected]
> Subject: Re: CXF 3.1 + Tomcat 8 + JAR-RS + Atmosphere + WebSocket
>
> Hi Anthony
>
> It all looks OK, except that you select the older Atmosphere version, it
> has to be 2.4.3 - so start from removing that pom section where you get
> an older version from the non-Central maven location.
>
> The other thing - enabling async (suspended) continuations is not needed
> for WebSocket (AFAIK), I'm not sure if it interferes, try disabling this
> CXFServlet setting if using the latest Atmosphere does not help (it
> would an issue of its own - but for now lets try to isolate where the
> problem is)
>
> Sergey
> On 28/09/16 16:26, MULLER, Anthony wrote:
>> Hello CXF Experts, Sergey, Aki,
>>
>> I have some issues to implement a simple test using WebSocket with CXF
>> 3.1.7, in a Tomcat 8 Servlet container.
>>
>> To make troubleshooting easier, I shared my demo project (based on the
>> official CXF samples written by Aki):
>> https://github.com/AnthonyMullerPlayground/cxf31_websocket
>>
>> The webapp context is "cxf31_websocket" and it contains a simple RESTful
>> service running under "/services/users" path.
>>
>> The project also contains a basic index.html webpage to test the websocket.
>>
>> CXF is bootstrapped using: org.apache.cxf.transport.servlet.CXFServlet
>>
>> Spring is used to and configured this way with a "beans.xml" file:
>>
>> <jaxrs:server id="websocketService" address="/"
>> transportId="http://cxf.apache.org/transports/websocket" />
>> <context:component-scan base-package="com.sap.businessobjects.amuller"/>
>>
>> When I check the websocket using Chrome, the following error is displayed in
>> the Network panel of the developer tools:
>>
>> Request headers:
>> GET ws://localhost:8080/cxf31_websocket/services HTTP/1.1
>> Host: localhost:8080
>> Connection: Upgrade
>> Pragma: no-cache
>> Cache-Control: no-cache
>> Upgrade: websocket
>> Origin: http://localhost:8080
>> Sec-WebSocket-Version: 13
>> User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
>> (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
>> Accept-Encoding: gzip, deflate, sdch
>> Accept-Language: en-US,en;q=0.8,fr;q=0.6
>> Sec-WebSocket-Key: Uc/E4OEE/BnKx/EvHUgLtQ==
>> Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
>>
>> Response headers:
>> HTTP/1.1 501 Not Implemented
>> Server: Apache-Coyote/1.1
>> X-Atmosphere-first-request: true
>> X-Atmosphere-tracking-id: aeeb9f45-62e8-45b4-9d37-4657988e20ec
>> X-Atmosphere-error: Websocket protocol not supported
>> Transfer-Encoding: chunked
>> Date: Wed, 28 Sep 2016 15:21:58 GMT
>> Connection: close
>>
>> No error is displayed in the Eclipse console... I'm stuck because I didn't
>> really get the magic behind the scene. It seems that the transportId
>> attribute is enabling the full WebSocket logic?
>> (transportId="http://cxf.apache.org/transports/websocket")
>>
>> Thanks for your help and explanations.
>>
>> Best regards,
>> Anthony MÜLLER
>>
>>
>>
>>
>