servicemix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Amigo_ <harim...@gmail.com>
Subject Re: Invoking external web service from SE
Date Tue, 01 Jun 2010 18:41:39 GMT


Freeman Fang wrote:
> 
> Hi,
> 
> My comment inline.
> On 2010-6-1, at 上午4:24, Amigo_ wrote:
> 
>>
>>
>> Freeman Fang wrote:
>>>
>>>
>>> On 2010-5-30, at 下午11:54, Amigo_ wrote:
>>>
>>>>
>>>> Hi,
>>>>
>>>> I need to invoke external web service from SE. I've generated codes
>>>> for
>>>> client using Apache CXF, but any invocations are blocked by
>>>> servicemix.
>>>>
>>>> I've searched this forum and I've read that there should a binding
>>>> component
>>>> between my SE and WS, but I can hardly find any tutorials. I will be
>>>> very
>>>> glad if someone could post any links to tutorials or just clues
>>>> explaining
>>>> how to ensure communication with external ws over servicemix.
>>>>
>>> Hi,
>>> In your case you need a cxf bc provider endpoint, so the flow looks  
>>> like
>>>
>>> SE-->cxf bc providier--> external ws,
>>>
>>> You may need take a look at CxfBcProviderTest to get details about  
>>> how
>>> it works.
>>>
>>> [1]https://svn.apache.org/repos/asf/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java
>>>
>>> Freeman
>>>
>>
>> Thanks for reply, but I can't make this works yet. I've searched  
>> internet
>> and found similar post with link to this CxfBcProviderTest.java.
>>
>>>>>   So we need to create raw SOAP message in order to pass data  
>>>>> instead
>>>>> of
>>>>> directly deal with a JavaBean
>>>>>
>>>> No, you needn't create raw soap message yourself.
>>>> The raw soap message you saw in the test case is just a simple way  
>>>> to
>>>> invoke the cxf se, it's not the key point of that test case.  The  
>>>> key
>>>> point of that test case is cxf se can hold proxy of cxf bc  
>>>> provider so
>>>> that you can invoke external webservice
>>
>> I assume I have to define cxf bc provider and managed to communicate  
>> with my
>> generated from wsdl cxf client. I added to my bundle-context.xml -
>> cxfbc:provider and it looks like:
>>
>> <beans xmlns="http://www.springframework.org/schema/beans"
>> 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> xmlns:osgi="http://www.springframework.org/schema/osgi"
>> 	xmlns:camel-osgi="http://camel.apache.org/schema/osgi"
>> xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
>> 	xsi:schemaLocation="
>>       http://www.springframework.org/schema/beans
>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
>>       http://www.springframework.org/schema/osgi
>> http://www.springframework.org/schema/osgi/spring-osgi.xsd
>>       http://camel.apache.org/schema/osgi
>> http://camel.apache.org/schema/osgi/camel-osgi.xsd
>>       http://servicemix.apache.org/cxfbc/1.0
>> http://servicemix.apache.org/cxfbc/1.0/servicemix-cxf-bc.xsd">
>>
>> 	<camel-osgi:camelContext xmlns="http://camel.apache.org/schema/ 
>> spring">
>> 		<route>
>> 			<from uri="timer://myTimer?fixedRate=true&amp;period=30000" />
>> 			<bean ref="translator" method="translate" />
>> 		</route>
>> 	</camel-osgi:camelContext>
>>
>> 	<bean class="com.amigo.cxf.TranslatorClient" id="translator" />
>>
>> 	<cxfbc:provider wsdl="http://localhost:9090/Translator/translate? 
>> WSDL"
>> 		locationURI="http://localhost:9090/Translator/translate"
>> 		endpoint="tns:translatorSOAP" service="translatorSOAP">
>> 	</cxfbc:provider>
>>
>> </beans>
> One obvious problem I can tell now is you need add
> <bean class="org.apache.servicemix.common.osgi.EndpointExporter" />
> when you use jbi endpoint in osgi container.
> You may need take a look at cxf-wsdl-first-osgi-package example  
> shipped with kit to get idea how jbi endpoint works with osgi package.
> 
> Freeman
> 

Hi, thanks for reply. I followed carefully this example and have made some
changes to my bundle-context.xml It looks now like this:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
	xmlns:camel-osgi="http://camel.apache.org/schema/osgi"
xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0" 
	xmlns:cxfse="http://servicemix.apache.org/cxfse/1.0"
	xsi:schemaLocation="
       http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/osgi 
http://www.springframework.org/schema/osgi/spring-osgi.xsd
       http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd
       http://camel.apache.org/schema/osgi
http://camel.apache.org/schema/osgi/camel-osgi.xsd
       http://servicemix.apache.org/cxfbc/1.0
http://servicemix.apache.org/cxfbc/1.0/servicemix-cxf-bc.xsd
       http://servicemix.apache.org/cxfse/1.0
http://servicemix.apache.org/cxfse/1.0/servicemix-cxf-se.xsd">

	<camel-osgi:camelContext xmlns="http://camel.apache.org/schema/spring">
		<route>
			<from uri="timer://myTimer?fixedRate=true&amp;period=3000000" />
			<bean ref="translator" method="translate" />
		</route>
	</camel-osgi:camelContext>

	<bean class="com.amigo.cxf.TranslatorClient" id="translator" />

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-http-binding.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />

	<cxfse:endpoint>
		<cxfse:pojo>
			<bean class="com.amigo.cxf.Translator_Service" />
		</cxfse:pojo>
	</cxfse:endpoint>

	<cxfbc:provider
		wsdl="http://localhost:9090/Translator?wsdl"
		locationURI="http://localhost:9090/Translator/translate"
		endpoint="tns:translatorSOAP" service="translatorSOAP">
	</cxfbc:provider>

	<bean class="org.apache.servicemix.common.osgi.EndpointExporter" />

</beans>

But unfortunately it still doesn't work. Now I have error about no conduit
initiatior. As far as I could searched in internet it could be caused by
lack of the cxf-rt-transports-http-jetty dependency - but i added. 
20:29:44,990 | ERROR | myTimer          | DefaultErrorHandler              |
rg.apache.camel.processor.Logger  248 | Failed delivery for exchangeId:
8a7feae2-5d6e-4e48-af34-1c8721c4dc97. Exhausted after delivery attempt: 1
caught: javax.xml.ws.soap.SOAPFaultException: No conduit initiator was found
for the namespace http://schemas.xmlsoap.org/soap/http.
javax.xml.ws.soap.SOAPFaultException: No conduit initiator was found for the
namespace http://schemas.xmlsoap.org/soap/http.
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
	at $Proxy142.translate(Unknown Source)
	at com.amigo.cxf.TranslatorClient.translate(TranslatorClient.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:214)
	at
org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:133)
	at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:137)
	at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
	at
org.apache.camel.processor.DelegateProcessor.processNext(DelegateProcessor.java:53)
	at
org.apache.camel.processor.DelegateProcessor.proceed(DelegateProcessor.java:82)
	at
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:93)
	at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
	at
org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:177)
	at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:143)
	at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
	at
org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
	at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:228)
	at
org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:66)
	at
org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
	at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
	at
org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:103)
	at
org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:50)
	at java.util.TimerThread.mainLoop(Timer.java:534)
	at java.util.TimerThread.run(Timer.java:484)
Caused by: org.apache.cxf.BusException: No conduit initiator was found for
the namespace http://schemas.xmlsoap.org/soap/http.
	at
org.apache.cxf.transport.ConduitInitiatorManagerImpl.getConduitInitiator(ConduitInitiatorManagerImpl.java:112)
	at
org.apache.cxf.endpoint.AbstractConduitSelector.getSelectedConduit(AbstractConduitSelector.java:73)
	at
org.apache.cxf.endpoint.UpfrontConduitSelector.prepare(UpfrontConduitSelector.java:61)
	at
org.apache.cxf.endpoint.ClientImpl.prepareConduitSelector(ClientImpl.java:715)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:478)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:310)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:262)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
	... 26 more


My earlier error with org.apache.cxf.bus.CXFBusFactory was probably caused
by cxf-bundle - because my own web service after installation of this bundle
started to output same error, so uninstalled this bundle.
-- 
View this message in context: http://old.nabble.com/Invoking-external-web-service-from-SE-tp28722871p28745838.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.


Mime
View raw message