Ordinary hut

人间一福地,胜似天仙宫
posts - 61, comments - 50, trackbacks - 0, articles - 1

Camel与cxf

Posted on 2011-09-29 13:50 landor 阅读(2144) 评论(2)  编辑  收藏 所属分类: camel
camel是一个路由选择引擎,具体内容可见
http://camel.apache.org
还有一本camel in action,对camel核心进行了详细讲解;

这是一个简单的例子,接收一个webservice消息,并且通过camel把消息路由给一个bean;
需要一些jar包:
apache-cxf-2.3.3\lib\cxf-2.3.3.jar
apache
-cxf-2.3.3\lib\XmlSchema-1.4.7.jar
apache
-cxf-2.3.3\lib\neethi-2.0.4.jar
apache
-cxf-2.3.3\lib\wss4j-1.5.11.jar
apache
-cxf-2.3.3\lib\wsdl4j-1.6.2.jar
apache
-cxf-2.3.3\lib\geronimo-servlet_3.0_spec-1.0.jar
apache
-cxf-2.3.3\lib\jsr311-api-1.1.1.jar
apache
-cxf-2.3.3\lib\jetty-continuation-7.2.2.v20101205.jar
apache
-cxf-2.3.3\lib\jetty-http-7.2.2.v20101205.jar
apache
-cxf-2.3.3\lib\jetty-server-7.2.2.v20101205.jar
apache
-cxf-2.3.3\lib\jetty-util-7.2.2.v20101205.jar
apache
-cxf-2.3.3\lib\jetty-io-7.2.2.v20101205.jar
apache
-camel-2.7.1\lib\spring\spring-beans-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\spring-context-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\spring-context-support-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\spring-core-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\spring-expression-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\spring-tx-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\aopalliance-1.0.jar
apache
-camel-2.7.1\lib\spring\commons-logging-1.1.1.jar
apache
-camel-2.7.1\lib\spring\spring-aop-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\spring\spring-asm-3.0.5.RELEASE.jar
apache
-camel-2.7.1\lib\slf4j-api-1.6.1.jar
apache
-camel-2.7.1\lib\camel-core-2.7.1.jar
apache
-camel-2.7.1\lib\commons-management-1.0.jar
apache
-camel-2.7.1\lib\camel-cxf-2.7.1.jar
apache
-camel-2.7.1\lib\camel-spring-2.7.1.jar

1 新建bean:
package bean;
public class Usr {
    
public String test(String str){
        System.out.println(
"Hello Bean    "+str);
        
return "Hello Bean    "+str;
    }
}

2 再新建一个webservice接口文件:
package server;
import javax.jws.WebService;
@WebService
public interface IHello {
    String sayHi(String name);
}

3 需要建立spring配置文件,放在classpath下
配置文件有两个用途:
    用cxf发布一个webservice;
    配置camel的route
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cxf
="http://camel.apache.org/schema/cxf"
    xmlns:camel
="http://camel.apache.org/schema/spring"
    xsi:schemaLocation
="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://camel.apache.org/schema/spring 
        http://camel.apache.org/schema/spring/camel-spring.xsd
        http://camel.apache.org/schema/cxf
        http://camel.apache.org/schema/cxf/camel-cxf.xsd"
>

    
<import resource="classpath:META-INF/cxf/cxf.xml" />
    
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    
<import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />
    
    
<!--发布一个webservice-->
    
<cxf:cxfEndpoint id="orderEndpoint"
                 address
="http://localhost:9000/helloWorld"
                 serviceClass
="server.IHello"
                 
/>
    
    
<bean id="usr" class="bean.Usr"></bean>
        
    
<camelContext xmlns="http://camel.apache.org/schema/spring">
        
<route>
            
<from uri="cxf:bean:orderEndpoint"/>
            
<bean ref="usr" method="test"/>
        
</route>
    
</camelContext>
</beans>

4 启动camel:

package camel;
import org.apache.camel.spring.Main;
public class Helloworld {
    
public static void main(String[] args) throws Throwable {
        Main main 
= new Main();
        main.start();
        Thread.sleep(
600000);
        main.stop();
    }
}

5 写个webservice客户端测试一下:
package client;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import server.IHello;
public class Test {
    
public static void main(String[] args) throws Throwable{
        URL wsdlURL 
= new URL("http://localhost:9000/helloWorld?wsdl");//WSDL文件地址
        QName SERVICE_NAME 
= new QName("http://server/""IHelloService");//参数一是WSDL中的 targetNamespace,参数2是WSDL中的 name 节点
        Service service = Service.create(wsdlURL, SERVICE_NAME);
        IHello client 
= service.getPort(IHello.class);
        String result 
= client.sayHi("bbb");
        System.out.println(result);
    }
}

得到的结果应该是:
Hello Bean    bbb

Feedback

# re: Camel与cxf  回复  更多评论   

2012-06-10 20:17 by jdkleo
我的client代码:
public class CamelCxfClient {
public static void main(String[] args) throws Throwable{
URL wsdlURL = new URL("http://localhost:8080/camel_ws/webservice/helloWorld?wsdl");
// QName SERVICE_NAME = new QName("http://www.springframework.org/schema/beans", "helloWorld");

QName SERVICE_NAME = new QName("http://www.springframework.org/schema/beans", "helloWorld");
Service service = Service.create(wsdlURL, SERVICE_NAME);
IHelloWorld client = service.getPort(IHelloWorld.class);
String result = client.sayHi("bbb");
System.out.println(result);
}
}
我跑后变成这样:
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: org.apache.cxf.message.Exchange.getBindingOperationInfo()Lorg/apache/cxf/service/model/BindingOperationInfo;
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:143)
at $Proxy35.sayHi(Unknown Source)
at camel.ws.CamelCxfClient.main(CamelCxfClient.java:13)
Caused by: org.apache.cxf.binding.soap.SoapFault: org.apache.cxf.message.Exchange.getBindingOperationInfo()Lorg/apache/cxf/service/model/BindingOperationInfo;
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:96)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:658)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2139)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2022)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1947)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:472)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:302)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:254)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:123)
... 2 more

# re: Camel与cxf  回复  更多评论   

2012-06-10 20:30 by jdkleo
i am so sorry that i find
in my pom.xml
the <cxf.version>2.2.3</cxf.version>
that must be changed to
<cxf.version>2.3.3</cxf.version>
oh fuck

只有注册用户登录后才能发表评论。


网站导航: