camel-cxf should fully support cxf jbi transport
------------------------------------------------

                 Key: CAMEL-1818
                 URL: https://issues.apache.org/activemq/browse/CAMEL-1818
             Project: Apache Camel
          Issue Type: Improvement
          Components: camel-cxf
    Affects Versions: 1.6.0
            Reporter: Ron Gavlin


I would like to incorporate the camel-cxf component into smx-camel and use 
wsdl2java-generated stubs to send jbi requests and receive jbi responses from 
smx-cxf-bc and smx-cxf-se endpoints. Essentially, what I can do today in the 
smx-cxf-se container with proxies I would also like to be able to do in the 
smx-camel.

The discussion on this topic with willem and ffang is pasted below.

<rong>  willem: i have code currently running in smx-cxf-se that I would like 
to move into smx-camel. The code in smx-cxf-se uses wsdl2java to proxy to a 
smx-cxf-bc provider. If I bundle the camel-cxf component within smx-camel, 
should I be able to port this code over from smx-cxf-se to smx-camel?
        <rong>  willem: of course, I would provide a jbi location uri as the 
proxy address.
        <willem>        rong: wsdl2java generated artifacts can be used in 
camel-cxf.
        <rong>  willem: so in this scenario, I am not explicitly using 
camel-cxf at all. I presume it is being used behind the scenes to send a camel 
CxfExchange which then gets converted into a jbi exchange on its way to the 
smx-cxf-bc provider. Is that how you would understand it?
        <rong>  willem: the smx-cxf-bc provider allows me to share the same jbi 
endpoint configuration across numerous camel routes defined in different 
smx-camel sus.
        <willem>        rong: Do you still want to use the smx-cxf-bc for the 
transport work ?
        <willem>        rong: are you using SMX 3?
        <rong>  willem: i see it as providing a single exit/entry point on the 
bus that can be shared across numerous camel routes. Yes, I am still on smx3.
        <willem>        rong: do you just want route the jbi message to camel 
and let camel call the POJO as the smx-cxf-se does?
        <rong>  willem: what advantage would defining a separate smx-camel su 
with a route "from jbi to cxf" have over directly using the smx-cxf-bc provider?
        <rong>  willem: no, i have a service that choreographs multiple 
external SOAP services. Today, the work is done in smx-cxf-se. It would be more 
convenient to do the choreography work in camel where I can inline other 
mediation/routing operations with the external SOAP service invocations.
        <rong>  willem: I know how the smx-cxf-se proxies to smx-cxf-bc 
provider endpoints. However, it is not clear how the wsdl2java-generated 
classes running in smx-camel would use camel-cxf behind the scenes to send a 
jbi message to the smx-cxf-bc provider endpoint.
        <willem>        rong; If you just want to routing the raw message and 
don't get the CXF interceptor get touch of the message, you could route the JBI 
message into the camel.
        <rong>  willem: I am not sure I understand your comment. When I say 
smx-cxf-bc provider, I am using the term "provider" in jbi speak, meaning it is 
a proxy to an external service. So, I am not trying to route a message into 
camel, I am trying to route a message out of camel to the "jbi provider". Does 
that make sense?
        <willem>        rong: but for camel-cxf , it doesn't take the transport 
and soap stack business apart. if you still want to the smx-cxf-se's marshal 
and unmarshal work do inside the camel, you still need to route the message to 
smx-cxf-se and camel-cxf can't do it.
        <rong>  willem: doesn't cxf's native support for the jbi transport mean 
that the wsdl2java-generated stubs running in smx-camel do the jbi work for me. 
I was thinking I was only using camel-cxf to essentially import the relevant 
cxf jars. When the smx-cxf-se proxies to the smx-cxf-bc provider, is it doing 
more for me than I realize?
        <willem>        rong: wsdl2java generated artifacts are for the mapping 
between the xml message and Java objects, they can't handle the jbi transport 
themselves. It need the CXF runtime to handle it.
        <willem>        rong : I don't know what the smx-cxf-se proxies does, 
maybe I need to ask ffang to join this discussion.
        <rong>  willem: i was thinking the same thing...
        <rong>  ffang: ping
        <ffang> rong:pong
        <rong>  ffang: i have been chatting with willem about moving some 
integration logic from a smx-cxf-se component to smx-camel. Do you have a 
moment to read our discussion history here and provide additional insight 
regarding how proxies to smx-cxf-bc providers work in smx-cxf-se?
        <ffang> rong: sure, basically, proxy in cxf se means, cxf se can hold 
the proxy of provider endpoint inside jbi bus, then from within the cxf se 
endpoint, can use this proxy to send message exchange to the provider endpoint 
just like a normal java invocation, but the provider endpoint must has the wsdl 
interface
        <rong>  ffang: So, ii am trying to determine if the smx-cxf-se itself 
has magic to support proxying to smx-cxf-bc providers or if all the magic is 
the cxf runtime's support for jbi destinations...
        <ffang> rong: so you can from smx-cxf-se, use proxy of other cxf se 
endpoint/ cxf bc provider/ jsr181 se endpoint, because all of these provider 
endpoint has wsdl as interface
        <willem>        ffang: does smx-cxf-se still need to marshal and 
unmarshal of the incoming and outgoing JBI message ?
        <ffang> rong: in your scenario, if camel se(as a provider) has wsdl 
interface, then it should be ok
        <ffang> willem: yeah
        <willem>        ffang: Does the wsdl interface means SEI ?
        <rong>  ffang: so, in smx-camel, if i bundle the camel-cxf component to 
incorporate the cxf runtime and I use wsdl2java-generated stubs with a jbi 
locationUri pointing to the smx-cxf-bc provider (just like I do in smx-cxf-se 
today), the code should port from smx-cxf-se to smx-camel?
        <ffang> rong: yeah, cxf se proxy use cxf JBI destination underlying, 
but it doesn't care the provider endpoint on the other side is cxf bc provider 
or not, any provider has wsdl interface should be ok
        <ffang> willem: yeah
        <rong>  ffang: but in this case, i wouldn't be using the cxf-se proxy. 
i am running in smx-camel and trying to send a jbi request to smx-cxf-bc 
provider using wsdl2java-generated classes.
        <rong>  ffang: is all the work i need being done in the cxf jbi 
transport layer and not in the cxf-se?
        <rong>  ffang: the jbi proxy work, i mean
        <ffang> rong: yeah, basically it's cxf runtime issue, I mean here 
mainly involve ClientProxyFactoryBean(which is cxf client proxy) an cxf JBI 
transport
        <ffang> willem: can we use ClientProxyFactoryBean from camel-cxf now?
        <rong>  ffang: am I correct that the major drawback of using this 
technique, i.e., ClientProxyFactoryBean, is that only synchronous invocations 
are supported. OTOH, if I manually build the request rather than using 
wsdl2java-generated classes, then I can asynchronously send the request, 
correct?
        <willem>        ffang: camel-cxf uses ClientProxyFactoryBean to create 
the proxy to send the request to out side of service.
        <willem>        ffang: I think the issue is how to initial the JBI 
transport in normal CXF endpoint.
        <willem>        ffang: current camel-cxf endpoint can't consume the JBI 
message directly.
        <ffang> rong: yeah
        <ffang> rong: actually no
        <rong>  willem: when the cxf runtime sees a jbi location uri, doesn't 
it know to automatically perform this initialization? I would think camel-cxf 
endpoint would play any role here, except making sure it brings with it the jbi 
transport jars.
        <ffang> rong: even we use sendSync in proxy to send out MessageChangr, 
but for cxf client api level, we have asyn, so the asyn/sync of cxf client api 
decouple with the underlying transport
        <ffang> rong: think about cxf client can support async over http 
transport, which is sync indeed
        <rong>  willem: s/would/would not
        <willem>        rong: yes, if you take a look at the 
CxfSeProxyFactoryBean in cxf-se, cxf-se did some customization on the client 
side.
        <ffang> willem: it's easy do use JBI transport, just do like 
cf.setAddress("jbi://" + "anything");
        <rong>  ffang: it looks like CxfSeProxyFactoryBean has a reasonable 
amount of goodness to make proxies work with MTOM attachments, etc. Any idea 
how much of this functionality would have to be integrated into cxf, camel-cxf, 
or smx-camel? Would it make sense to move this into the cxf jbi library as a 
helper class so that smx-cxf-se and camel can share it?
        <ffang> rong: yeah, maybe some interceptors should move to cxf code 
base, if these would be shared by camel-cxf also
        <rong>  willem, ffang: so it sounds to me like camel-cxf does not 
currently fully support the cxf jbi transport. If you agree, I'll open a Camel 
JIRA for this functionality to be added to the camel-cxf component.
        <willem>        rong: current camel JBI related work is done in 
servicemix-camel component, I don't know if it is right for camel-cxf do 
consume or produce any JBI related message.
        <willem>        rong: if you want to camel-cxf handle the JBI message 
from smx-cxf-se and smx-cxf-bc, we need to do merge the JBI related work in to 
camel-cxf.
        <willem>        rong: please feel free to fill that requirement.
        <rong>  willem: yes, i want camel-cxf to send jbi request and receive 
jbi response from both smx-cxf-se & smx-cxf-bc. So, should that be a camel-cxf 
JIRA?
        <willem>        rong: yes, camel-cxf can cover that.
        <rong>  willem, ffang: thanks for your assistance. i'll open a 
camel-cxf JIRA then.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to