cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Romain Manni-Bucau <rmannibu...@gmail.com>
Subject Re: cxi integration: multiple buses during deployment?
Date Wed, 19 Oct 2016 17:15:35 GMT
http://svn.apache.org/repos/asf/openwebbeans/microwave/trunk/ just run core
module

Think the extension was written with Weld which behaves a bit differently
from openwebbeans on that point.


Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<https://blog-rmannibucau.rhcloud.com> | Old Wordpress Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
<http://www.tomitribe.com> | JavaEE Factory
<https://javaeefactory-rmannibucau.rhcloud.com>

2016-10-19 19:08 GMT+02:00 Andrey Redko <drreta@gmail.com>:

> Hey Roman,
>
> Thanks a lot for verifying. Would you mind to share the sample project to
> reproduce the issue?
> There seems to be more things to take into account.
> Thanks.
>
> Best Regards,
>     Andriy Redko
>
> On Wed, Oct 19, 2016 at 9:24 AM, Romain Manni-Bucau <rmannibucau@gmail.com
> > wrote:
>
>> doesn't work but for a weirder reason.
>>
>> CdiBean is added programmatically - all fine
>>
>> Then it is directly used to get the bus (in "use the default bus" mode).
>> This is not really fine since the CDI impl is free to wrap this so you
>> should retrieve the actual instance of the bus and get it with this Bean
>> instance and not supposing the CDI container will return you the instance
>> you added.
>>
>> Concretely here are the few fixes (on 3.1.x-fixes branch):
>> https://gist.github.com/rmannibucau/0bb8abf2e164d953be17b24b4a08e685
>>
>> In CDI you can't assume equals/hashcode of Bean<?> so you need to lookup
>> the bus instance and not use the internal one. This patch solves the issue.
>>
>>
>>
>>
>>
>> Romain Manni-Bucau
>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>> <https://blog-rmannibucau.rhcloud.com> | Old Wordpress Blog
>> <http://rmannibucau.wordpress.com> | Github
>> <https://github.com/rmannibucau> | LinkedIn
>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>> <http://www.tomitribe.com> | JavaEE Factory
>> <https://javaeefactory-rmannibucau.rhcloud.com>
>>
>> 2016-10-19 13:35 GMT+02:00 Andrey Redko <drreta@gmail.com>:
>>
>>> Hi Roman,
>>>
>>> Thanks a lot for clarifying on things. Could you please try latest
>>> 3.1.9-SNAPSHOT / 3.2.0-SNAPSHOT against this issue?
>>> The fix should be there. Thanks!
>>>
>>> Best Regards,
>>>     Andriy Redko
>>>
>>> On Wed, Oct 19, 2016 at 2:28 AM, Romain Manni-Bucau <
>>> rmannibucau@gmail.com> wrote:
>>>
>>>> Le 19 oct. 2016 04:14, "Andriy Redko" <drreta@gmail.com> a écrit :
>>>> >
>>>> > I think this is what is happening:
>>>> >  - Roman defines own CXF bus bean, named "cxf"
>>>>
>>>> This is a workaround to be able to lookup the bus in my workaround
>>>> extension. Not doing it without my extension leads to the issue.
>>>>
>>>> >  - our JAX-RS CDI extension finds it and makes it a "default" bus to
>>>> be used
>>>> >    for JAXRSServerFactoryBean instances
>>>> >  - however, JAXRSServerFactoryBean::setApplication() would create a
>>>> new bus
>>>> >    nonetheless, because the actual call to
>>>> JAXRSServerFactoryBean::setBus would
>>>> >    be done later
>>>> >
>>>>
>>>> This is the issue, custom bus or not.
>>>>
>>>> > The issue in this case is that application was created using one bus
>>>> instance,
>>>> > but JAXRSServerFactoryBean would be initialized using another bus
>>>> instance. This
>>>> > is my understading of the problem. Hopefully it makes sense.
>>>> >
>>>>
>>>> The factory uses the cdi bus but the application used a "prototype" bus.
>>>>
>>>> Side note: i deploy with tomcat embedded a single app so I am not in
>>>> "multiple" deployments case.
>>>>
>>>> > Best Regards,
>>>> >     Andriy Redko
>>>> >
>>>> > JDA> So still something isn't clicking as I don't have Romain's
>>>> issue. Is it
>>>> > JDA> specific to when you have multiple deployments in your JVM?
>>>> >
>>>> > JDA> On Oct 18, 2016 09:02, "Romain Manni-Bucau" <
>>>> rmannibucau@gmail.com> wrote:
>>>> >
>>>> > >> 2016-10-18 14:43 GMT+02:00 Andrey Redko <drreta@gmail.com>:
>>>> >
>>>> > >> > Hi Romain Manni-Bucau,
>>>> > >> >
>>>> > >> > Yes, technically we do have this option, but I would suggest
to
>>>> use
>>>> > >> > explicit wirings instead of thread local context.  It
>>>> > >> > could have quite a number of side effects. I hope you
would
>>>> agree with
>>>> > >> > that.
>>>> > >> >
>>>> > >> >
>>>> > >> I agree it is better but side effect should be null since the
>>>> value is
>>>> > >> cleaned up after. If not then runtime can have side effects
which
>>>> would be
>>>> > >> a bigger issue ;)
>>>> >
>>>> >
>>>> > >> > Thanks!
>>>> > >> >
>>>> > >> > Best Regards,
>>>> > >> >     Andriy Redko
>>>> > >> >
>>>> > >> >
>>>> > >> > On Tue, Oct 18, 2016 at 7:49 AM, Romain Manni-Bucau <
>>>> > >> rmannibucau@gmail.com
>>>> > >> > >
>>>> > >> > wrote:
>>>> > >> >
>>>> > >> > > We also have option 3: set the thread bus as in the
workaround
>>>> I used.
>>>> > >> > >
>>>> > >> > >
>>>> > >> > > Romain Manni-Bucau
>>>> > >> > > @rmannibucau <https://twitter.com/rmannibucau>
|  Blog
>>>> > >> > > <https://blog-rmannibucau.rhcloud.com> | Old
Wordpress Blog
>>>> > >> > > <http://rmannibucau.wordpress.com> | Github
<
>>>> https://github.com/
>>>> > >> > > rmannibucau> |
>>>> > >> > > LinkedIn <https://www.linkedin.com/in/rmannibucau>
|
>>>> Tomitriber
>>>> > >> > > <http://www.tomitribe.com> | JavaEE Factory
>>>> > >> > > <https://javaeefactory-rmannibucau.rhcloud.com>
>>>> > >> > >
>>>> > >> > > 2016-10-18 13:47 GMT+02:00 Sergey Beryozkin <
>>>> sberyozkin@gmail.com>:
>>>> > >> > >
>>>> > >> > > > Hi Andriy
>>>> > >> > > > yes, option 1 is probably the simplest for the
CDI
>>>> integration path,
>>>> > >> > > >
>>>> > >> > > > Thanks, Sergey
>>>> > >> > > >
>>>> > >> > > > On 18/10/16 12:43, Andrey Redko wrote:
>>>> > >> > > >
>>>> > >> > > >> Hey guys,
>>>> > >> > > >>
>>>> > >> > > >> Indeed, there is an issue with CDI and usage
of custom bus.
>>>> I think
>>>> > >> > > there
>>>> > >> > > >> are couple of the options
>>>> > >> > > >> we have here:
>>>> > >> > > >>  - pass the bus instance to ResourceUtils::createApplication,
>>>> in
>>>> > >> this
>>>> > >> > > >> case
>>>> > >> > > >> if bus is not set, the behaviour would be
exactly the same
>>>> > >> > > >>  - change the way JAXRSServerFactoryBean
is being created
>>>> so we
>>>> > >> could
>>>> > >> > > set
>>>> > >> > > >> the bus before setting the application
>>>> > >> > > >>
>>>> > >> > > >> Romain Manni-Bucau, do we have a ticket
for it? If not,
>>>> could you
>>>> > >> > please
>>>> > >> > > >> create one, we'll work on a fix for it.
>>>> > >> > > >> Thanks.
>>>> > >> > > >>
>>>> > >> > > >>
>>>> > >> > > >> On Tue, Oct 18, 2016 at 7:08 AM, Romain
Manni-Bucau <
>>>> > >> > > >> rmannibucau@gmail.com>
>>>> > >> > > >> wrote:
>>>> > >> > > >>
>>>> > >> > > >> Not yet something failling i can share but
globally I ended
>>>> up doing
>>>> > >> > > that:
>>>> > >> > > >>>
>>>> > >> > > >>> @Named("cxf")
>>>> > >> > > >>> @ApplicationScoped
>>>> > >> > > >>> public class BusInstance implements
Bus {
>>>> > >> > > >>> @Delegate
>>>> > >> > > >>> private Bus delegate = new ExtensionManagerBus();
>>>> > >> > > >>> }
>>>> > >> > > >>> public class OWBAutoSetup implements
>>>> ServletContainerInitializer {
>>>> > >> > > >>> @Override
>>>> > >> > > >>> public void onStartup(final Set<Class<?>>
c, final
>>>> ServletContext
>>>> > >> > ctx)
>>>> > >> > > >>> throws ServletException {
>>>> > >> > > >>>
>>>> > >> > > >>> ctx.addListener(WebBeansConfigurationListener.class);
>>>> > >> > > >>> ctx.addListener(WebBeansConfig
>>>> urationHttpSessionListener.class);
>>>> > >> > > >>> }
>>>> > >> > > >>> }
>>>> > >> > > >>>
>>>> > >> > > >>>
>>>> > >> > > >>>
>>>> > >> > > >>> public class CxfCdiAutoSetup implements
>>>> > >> ServletContainerInitializer {
>>>> > >> > > >>> @Override
>>>> > >> > > >>> public void onStartup(final Set<Class<?>>
c, final
>>>> ServletContext
>>>> > >> > ctx)
>>>> > >> > > >>> throws ServletException {
>>>> > >> > > >>> final ServletRegistration.Dynamic jaxrs
=
>>>> ctx.addServlet("cxf-cdi",
>>>> > >> > > >>> CXFCdiServlet.class);
>>>> > >> > > >>>
>>>> > >> > > >>>
>>>> > >> > > >>> jaxrs.setLoadOnStartup(1);
>>>> > >> > > >>> jaxrs.setAsyncSupported(true);
>>>> > >> > > >>> jaxrs.addMapping("/*"); // TODO: config
>>>> > >> > > >>> }
>>>> > >> > > >>> }
>>>> > >> > > >>>
>>>> > >> > > >>>
>>>> > >> > > >>>
>>>> > >> > > >>> With my workaround extension it works
fine, without there
>>>> is this
>>>> > >> > > >>> mismatch
>>>> > >> > > >>> of bus.
>>>> > >> > > >>>
>>>> > >> > > >>> Have to admit I have no idea how
>>>> > >> > > >>> org.apache.cxf.jaxrs.utils.Res
>>>> ourceUtils#createApplication(
>>>> > >> > javax.ws.rs
>>>> > >> > > .
>>>> > >> > > >>> core.Application,
>>>> > >> > > >>> boolean, boolean) could reuse the right
bus in current
>>>> state of the
>>>> > >> > cdi
>>>> > >> > > >>> module. If you check
>>>> > >> > > >>> org.apache.cxf.cdi.JAXRSCdiRes
>>>> ourceExtension#createFactoryIn
>>>> > >> > > >>> stance(javax.
>>>> > >> > > >>> ws.rs.core.Application,
>>>> > >> > > >>> java.util.List<?>, java.util.List<?>,
java.util.List<?
>>>> extends
>>>> > >> > > >>> org.apache.cxf.feature.Feature>)
the bus is set but too
>>>> late
>>>> > >> (after
>>>> > >> > > bean
>>>> > >> > > >>> .setApplication(app);).
>>>> > >> > > >>>
>>>> > >> > > >>> Romain Manni-Bucau
>>>> > >> > > >>> @rmannibucau <https://twitter.com/rmannibucau>
|  Blog
>>>> > >> > > >>> <https://blog-rmannibucau.rhcloud.com>
| Old Wordpress
>>>> Blog
>>>> > >> > > >>> <http://rmannibucau.wordpress.com>
| Github <
>>>> https://github.com/
>>>> > >> > > >>> rmannibucau> |
>>>> > >> > > >>> LinkedIn <https://www.linkedin.com/in/rmannibucau>
|
>>>> Tomitriber
>>>> > >> > > >>> <http://www.tomitribe.com> | JavaEE
Factory
>>>> > >> > > >>> <https://javaeefactory-rmannibucau.rhcloud.com>
>>>> > >> > > >>>
>>>> > >> > > >>> 2016-10-18 12:50 GMT+02:00 John D. Ament
<
>>>> johndament@apache.org>:
>>>> > >> > > >>>
>>>> > >> > > >>> Do you have a sample project that demonstrates
the issue?
>>>> > >> > > >>>>
>>>> > >> > > >>>> Also, do you see setBus method being
called on
>>>> CXFCdiServlet?  How
>>>> > >> > > many
>>>> > >> > > >>>> times do you see it invoked?  Maybe
step through loadBus
>>>> to see
>>>> > >> > which
>>>> > >> > > >>>>
>>>> > >> > > >>> path
>>>> > >> > > >>>
>>>> > >> > > >>>> it follows.
>>>> > >> > > >>>>
>>>> > >> > > >>>> On Tue, Oct 18, 2016 at 6:24 AM
Romain Manni-Bucau <
>>>> > >> > > >>>>
>>>> > >> > > >>> rmannibucau@gmail.com>
>>>> > >> > > >>>
>>>> > >> > > >>>> wrote:
>>>> > >> > > >>>>
>>>> > >> > > >>>> Not really,
>>>> > >> > > >>>>>
>>>> > >> > > >>>>> I don't have any bus bean, just
using the default one of
>>>> the
>>>> > >> > > extenson -
>>>> > >> > > >>>>> behavior is the same however
if I impl my own bus bean.
>>>> > >> > > >>>>>
>>>> > >> > > >>>>> Issue is in the load() method
of the extension. It gets
>>>> the bus
>>>> > >> and
>>>> > >> > > >>>>>
>>>> > >> > > >>>> then
>>>> > >> > > >>>
>>>> > >> > > >>>> calls ResourceUtils.createApplication(application,
>>>> false, false)
>>>> > >> > > which
>>>> > >> > > >>>>>
>>>> > >> > > >>>> will
>>>> > >> > > >>>>
>>>> > >> > > >>>>> call org.apache.cxf.jaxrs.JAXRSServ
>>>> erFactoryBean#setApplication
>>>> > >> > > which
>>>> > >> > > >>>>>
>>>> > >> > > >>>> will
>>>> > >> > > >>>>
>>>> > >> > > >>>>> do getBus() wich uses BusFactory.getThreadDefaultBus()
>>>> which is
>>>> > >> > > >>>>>
>>>> > >> > > >>>> obviously
>>>> > >> > > >>>>
>>>> > >> > > >>>>> not set so you end up in org.apache.cxf.BusFactory#
>>>> > >> createThreadBus
>>>> > >> > > >>>>>
>>>> > >> > > >>>> which
>>>> > >> > > >>>
>>>> > >> > > >>>> does a newInstance().createBus()
and here you are, you
>>>> have 2
>>>> > >> > > instances
>>>> > >> > > >>>>>
>>>> > >> > > >>>> of
>>>> > >> > > >>>>
>>>> > >> > > >>>>> a bus.
>>>> > >> > > >>>>>
>>>> > >> > > >>>>> Romain
>>>> > >> > > >>>>>
>>>> > >> > > >>>>> 2016-10-18 12:10 GMT+02:00 John
D. Ament <
>>>> john.d.ament@gmail.com
>>>> > >> >:
>>>> > >> > > >>>>>
>>>> > >> > > >>>>> Romain,
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>> Depends on how you're trying
to instantiate it.  There
>>>> is a
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>> CdiBusBean
>>>> > >> > > >>>
>>>> > >> > > >>>> provided by CXF which does what
you're trying to do -
>>>> > >> > > >>>>>> https://github.com/apache/cxf/
>>>> blob/3.1.x-fixes/integration/
>>>> > >> > > >>>>>> cdi/src/main/java/org/apache/c
>>>> xf/cdi/CdiBusBean.java#L40
>>>> > >> > > >>>>>> ,
>>>> > >> > > >>>>>> take a look at the create
method.
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>> I was actually contemplating
removing the @Inject from
>>>> the
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>> CXFCdiServlet's
>>>> > >> > > >>>>>
>>>> > >> > > >>>>>> set method, it seems to
work inconsistently.  However,
>>>> i suspect
>>>> > >> > > that
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>> your
>>>> > >> > > >>>>>
>>>> > >> > > >>>>>> issue is that you're getting
a Bus registered as a
>>>> valid CDI
>>>> > >> bean
>>>> > >> > > >>>>>> (bean-discovery-mode=all?).
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>> John
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>> On Tue, Oct 18, 2016 at
5:58 AM Romain Manni-Bucau <
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>> rmannibucau@gmail.com>
>>>> > >> > > >>>>>
>>>> > >> > > >>>>>> wrote:
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>> Hi guys,
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> in cdi-integration I
don't get how the deployment can
>>>> work
>>>> > >> cause
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> the
>>>> > >> > > >>>
>>>> > >> > > >>>> thread
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>>> local bus is not set
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> Here what i did to ensure
i use a single bus (and
>>>> prevented the
>>>> > >> > cxf
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> one
>>>> > >> > > >>>>
>>>> > >> > > >>>>> to
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>>> run):
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> public class JAXRSCdiResourceExtensionWorkaround
>>>> extends
>>>> > >> > > >>>>>>> JAXRSCdiResourceExtension
{
>>>> > >> > > >>>>>>>     @Override
>>>> > >> > > >>>>>>>     public void load(@Observes
final
>>>> AfterDeploymentValidation
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> event,
>>>> > >> > > >>>
>>>> > >> > > >>>> final BeanManager beanManager) {
>>>> > >> > > >>>>>>>         final Bus bus
=
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> Bus.class.cast(beanManager.getReference(beanManager.
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> resolve(beanManager.getBeans(Bus.class)),
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>>> Bus.class, null));
>>>> > >> > > >>>>>>>         BusFactory.setThreadDefaultBus(bus);
// cause
>>>> app
>>>> > >> class
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> will
>>>> > >> > > >>>
>>>> > >> > > >>>> rely on that and would create multiple
bus and then
>>>> deployment
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> would
>>>> > >> > > >>>
>>>> > >> > > >>>> be broken
>>>> > >> > > >>>>>>>         try {
>>>> > >> > > >>>>>>>             super.load(event,
beanManager);
>>>> > >> > > >>>>>>>         } finally {
>>>> > >> > > >>>>>>>             BusFactory.clearDefaultBusFor
>>>> AnyThread(bus);
>>>> > >> > > >>>>>>>         }
>>>> > >> > > >>>>>>>     }
>>>> > >> > > >>>>>>> }
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> Issue was caused by
JAXRSCdiResourceExtension#
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> createFactoryInstance
>>>> > >> > > >>>
>>>> > >> > > >>>> which
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>>> calls ResourceUtils.createApplication
which uses the
>>>> thread
>>>> > >> bus
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>> which
>>>> > >> > > >>>>
>>>> > >> > > >>>>> is
>>>> > >> > > >>>>>
>>>> > >> > > >>>>>> not set by the extension
leading to 2 buses.
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> Did I miss something?
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>> Romain Manni-Bucau
>>>> > >> > > >>>>>>> @rmannibucau <https://twitter.com/rmannibucau>
|  Blog
>>>> > >> > > >>>>>>> <https://blog-rmannibucau.rhcloud.com>
| Old
>>>> Wordpress Blog
>>>> > >> > > >>>>>>> <http://rmannibucau.wordpress.com>
| Github <
>>>> > >> > > >>>>>>> https://github.com/rmannibucau>
|
>>>> > >> > > >>>>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau>
|
>>>> > >> Tomitriber
>>>> > >> > > >>>>>>> <http://www.tomitribe.com>
| JavaEE Factory
>>>> > >> > > >>>>>>> <https://javaeefactory-rmannibucau.rhcloud.com>
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>>
>>>> > >> > > >>>>>>
>>>> > >> > > >>>>>
>>>> > >> > > >>>>
>>>> > >> > > >>>
>>>> > >> > > >>
>>>> > >> > > >
>>>> > >> > > > --
>>>> > >> > > > Sergey Beryozkin
>>>> > >> > > >
>>>> > >> > > > Talend Community Coders
>>>> > >> > > > http://coders.talend.com/
>>>> > >> > > >
>>>> > >> > >
>>>> > >> >
>>>> >
>>>> >
>>>>
>>>
>>>
>>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message