You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Andriy Redko <dr...@gmail.com> on 2018/03/03 19:08:45 UTC

Re: Handling the case where CXF Servlet doesn't match expected transport ID

The documentation has been updated to include SSE transport, https://cwiki.apache.org/confluence/display/CXF20DOC/SSE,
should become available on the main site soon. 

JDA> I created https://issues.apache.org/jira/browse/CXF-7659


JDA> On Sun, Feb 25, 2018 at 11:38 AM Andriy Redko <dr...@gmail.com> wrote:

>> Sounds reasonable, would you mind to create a ticket? I could pick it up
>> shortly (or if you have time, please go ahead). Thanks.

>> JDA> Actually here's another way.


>> JDA> Create a new property on bus for the default transport ID
>> JDA> Default it to the HTTP one
>> JDA> in the SSE extension, override it to SSE.


>> JDA> On Sun, Feb 25, 2018 at 10:47 AM John D. Ament <jo...@apache.org>
>> wrote:

>> JDA> Basically, yes.


>> JDA> So here's what I'm thinking.


>> JDA> - Determine that transportId is null
>> JDA> - ask for the registered HTTP one ending with /configuration
>> JDA> - If that's null, loop through all registered and return the first
>> one ending with /configuration


>> JDA> Thoughts?



>> JDA> On Sun, Feb 25, 2018 at 10:44 AM Andriy Redko <dr...@gmail.com>
>> wrote:

>> JDA> Hey John,

>> JDA>  You mean add the capability to DestinationFactoryManager to list all
>> registered
>> JDA>  destination factories and in case transport id is not set, just pick
>> the first
>> JDA>  one? We could try it out, may be we could also give a preference to
>> HTTP transport
>> JDA>  in case more than one is available (at least to minimize the effect
>> of the change).

>> JDA>  Also, the documentation should be updated to reflect the SSE
>> transport presence, I
>> JDA>  will do that shortly. Thanks for spotting it.

>> JDA>  Makes sense?

>> JDA>  Best Regards,
>> JDA>     Andriy Redko

>>  JDA>> Andriy,

>>  JDA>> Sadly no.  Honestly, this leads to broken apps.  Just to clarify my
>> setup:

>>  JDA>> - WAR File deployed to Tomcat
>>  JDA>> - Has Weld Servlet + CXF CDI + CXF SSE modules deployed
>>  JDA>> - Has no SSE server side components

>>  JDA>> At this point, I may use the client to talk to a remote server (for
>>  JDA>> inter-node communication) but don't rely on it long term.  I have
>> no server
>>  JDA>> side components.  But you're saying I must set the transportId to
>> SSE.

>>  JDA>> The SSE transportId requirement is not documented anywhere as best
>> as I can
>>  JDA>> tell.  SSE isn't listed at
>> http://cxf.apache.org/docs/transports.html for
>>  JDA>> Atmosphere.

>>  JDA>> I think a better approach would be to modify
>>  JDA>> CXFNonSpringServlet.getDestinationRegistryFromBusOrDefault (
>>  JDA>>
>> https://github.com/apache/cxf/blob/master/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFNonSpringServlet.java#L119
>>  JDA>> )
>>  JDA>> so that instead of hard coding the HTTP transport as the default,
>> we ask
>>  JDA>> for the first destination factory it finds registered (if one is).

>>  JDA>> Thoughts?

>>  JDA>> John

>>  JDA>> On Sun, Feb 25, 2018 at 9:25 AM Andriy Redko <dr...@gmail.com>
>> wrote:

>>  >>> I wish it could be as easy as that :) Hope my previous messages give
>> some
>>  >>> context and explanations why we have dedicated transport and why we
>> need
>>  >>> to set Transport Id in a few places, not just one. It would be ideal
>> to
>>  >>> enrich HTTP transport with SSE support but it will take some time, not
>>  >>> an easy one (certainly doable).

>>  >>> Best Regards,
>>  >>>     Andriy Redko

>>  >>> JDA> I see a bit more when this is failing.

>>  >>> JDA> When the JAXRS bean has the transport ID set, In
>>  >>> DestinationFactoryManager
>>  >>> JDA> you have two factories created, both for SSE (regular & config
>>  >>> JDA> namespaces).  However, since on the servlet the transportId is
>> null
>>  >>> when it
>>  >>> JDA> tries to look up the namespace it defaults to the HTTP transport.
>>  >>> This
>>  >>> JDA> causes it to create a new destination factory where nothing has
>> been
>>  >>> found.

>>  >>> JDA> So I think what I would recommend is coming up with a way for
>> CXF to
>>  >>> figure
>>  >>> JDA> out a better default, instead of the using the default
>> transportId.

>>  >>> JDA> Or do as Romain says and make it so that SSE works on the normal
>>  >>> JDA> transportId.

>>  >>> JDA> John

>>  >>> JDA> On Sun, Feb 25, 2018 at 3:05 AM Romain Manni-Bucau <
>>  >>> rmannibucau@gmail.com>
>>  >>> JDA> wrote:

>>  >>> >> +1 wondered the same and technically sse can just be activated for
>> http
>>  >>> >> transport IMHO

>>  >>> >> Le 25 févr. 2018 05:10, "John D. Ament" <jo...@apache.org> a
>>  >>> écrit :

>>  >>> >> > Here's a reproducer app, if anyone else is curious.
>>  >>> >> > https://github.com/johnament/cxf-demo-reactive-cdi
>>  >>> >> >
>>  >>> >> > If you comment out
>>  >>> >> > https://github.com/johnament/cxf-demo-reactive-cdi/blob/
>>  >>> >> > master/src/main/webapp/WEB-INF/web.xml#L10-L13
>>  >>> >> > then
>>  >>> >> > you'll see the issue, but deploying this as is to tomcat will
>> work
>>  >>> just
>>  >>> >> > fine.
>>  >>> >> >
>>  >>> >> > On Sat, Feb 24, 2018 at 10:59 PM John D. Ament <
>> johndament@apache.org
>>  >>> >
>>  >>> >> > wrote:
>>  >>> >> >
>>  >>> >> > > Hi,
>>  >>> >> > >
>>  >>> >> > > So I've finally been able to confirm an issue.
>>  >>> >> > >
>>  >>> >> > > When CXF's SSE libraries are on the classpath, if the
>> transportId of
>>  >>> >> the
>>  >>> >> > > servlet does not match the transport ID set with the SSE
>> component,
>>  >>> >> then
>>  >>> >> > no
>>  >>> >> > > services are discovered.
>>  >>> >> > >
>>  >>> >> > > IMHO, there may be cases where the SSE libraries are present
>> (client
>>  >>> >> > only)
>>  >>> >> > > and no server runtimes are there.  In this case, the transport
>> ID
>>  >>> will
>>  >>> >> > not
>>  >>> >> > > match.
>>  >>> >> > >
>>  >>> >> > > I'm curious, do both need to be set?  What is the benefit/need
>> on
>>  >>> the
>>  >>> >> > > servlet layer needing the transport ID set when the underlying
>>  >>> feature
>>  >>> >> > also
>>  >>> >> > > does it?
>>  >>> >> > >
>>  >>> >> > > John
>>  >>> >> > >
>>  >>> >> >