2016-10-18 14:43 GMT+02:00 Andrey Redko <drr...@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 <rmannibu...@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 <sberyoz...@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 <
> > >> rmannibu...@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(WebBeansConfigurationHttpSessionListener.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.ResourceUtils#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.JAXRSCdiResourceExtension#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 <johndam...@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 <
> > >>>>
> > >>> rmannibu...@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.JAXRSServerFactoryBean#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.am...@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/cxf/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 <
> > >>>>>>
> > >>>>> rmannibu...@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.clearDefaultBusForAnyThread(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/
> > >
> >
>

Reply via email to