cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: cxi integration: multiple buses during deployment?
Date Tue, 18 Oct 2016 11:47:34 GMT
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(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 <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.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.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/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 <
>>>> 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.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/

Mime
View raw message