I think this is a known limitation that we have in CXF about how we
initialize atmosphere.
To initialize atmosphere with JSR356, you need to have a servlet
context and the way how atmosphere is initialized in CXF currently
does not have an access to a servlet context, hence it can't use
JSR356. In other words, we will need to adjust this CXF's atmosphere
initialization code so that it will work with JSR356 as well.


2016-09-29 21:40 GMT+02:00 MULLER, Anthony <[email protected]>:
> 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
>>>
>>>
>>>
>>>
>>
>

Reply via email to