here it is https://issues.apache.org/jira/browse/CXF-7095 (side note: affected it to 3.1.7 but 3.1.8 has the same bug)
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:43 GMT+02:00 Andrey Redko <drr...@gmail.com>: > 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# > createFactoryInstance(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> > > > > > > > > > > > > > > > > > > > > >