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#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>








--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Reply via email to