Apache ServiceMix集成了Camel、Camel-CXF,可以轻松地发布Web Service。
与传统的通过Servlet发布web Service的方式不同,我们可以通过Camel路由分别处理不同的web service调用。以下是一个简单的例子:
我们首先看看以下服务接口定义:
package com.ponder.ws;
public interface IService{
public long add(long p1,long p2);
public long sub(long p1,long p2);
}
接着看看blueprint:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:camel-cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:cxfcore="http://cxf.apache.org/blueprint/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd"
>
<bean id="addProcessor" class="com.ponder.ws.Impl.ServiceAdd"/>
<bean id="subProcessor" class="com.ponder.ws.Impl.ServiceSub"/>
<camel-cxf:cxfEndpoint id="IServiceWS"
address="http://0.0.0.0:8000/ws/IService"
serviceClass="com.ponder.ws.IService">
<camel-cxf:properties>
<entry key="dataFormat" value="POJO"/>
</camel-cxf:properties>
</camel-cxf:cxfEndpoint>
<camelContext id="ServiceCamelContext" xmlns="http://camel.apache.org/schema/blueprint" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<route id="IServiceRoute">
<from uri="IServiceWS" />
<log message="Request:${in.header.operationName}"/>
<choice>
<when>
<simple>${in.header.operationName} == 'add'</simple>
<to uri="bean:addProcessor"/>
</when>
<when>
<simple>${in.header.operationName} == 'sub'</simple>
<to uri="bean:subProcessor"/>
</when>
</choice>
</route>
</camelContext>
再看看addProcessor的写法:
package com.ponder.ws.Impl;
... ...
public class ServiceAdd implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
MessageContentsList mclist = exchange.getIn().getBody(MessageContentsList.class);
long p1=(long)mclist.get(0);
long p2=(long)mclist.get(1);
long result=p1+p2;
exchange.getOut().setBody(result);
}
}
subProcessor类似。
我们从blueprint里可以看到首先是两个bean的定义,不解释;
然后我们有一段:
<camel-cxf:cxfEndpoint id="IServiceWS"
address="http://0.0.0.0:8000/ws/IService"
serviceClass="com.ponder.ws.IService">
<camel-cxf:properties>
<entry key="dataFormat" value="POJO"/>
</camel-cxf:properties>
</camel-cxf:cxfEndpoint>
这里定义了一个Camel的endpoint,是Camel-CXF component的endpoint,component是camel的组件定义,你可以把它看成是endpoint Factory。这里实际上就是创建并配置了一个cxf endpoint,它负责接收客户端的请求,并将请求内容按Camel-CXF的规则填成一个Exchange,在后续的CamelContext里定义的路由就负责处理这个Exchange。
<route id="IServiceRoute">
<from uri="IServiceWS" />
<log message="Request:${in.header.operationName}"/>
<choice>
<when>
<simple>${in.header.operationName} == 'add'</simple>
<to uri="bean:addProcessor"/>
</when>
<when>
<simple>${in.header.operationName} == 'sub'</simple>
<to uri="bean:subProcessor"/>
</when>
</choice>
</route>
以上这段路由就是根据Exchange里的in.header.operationName判断,如果operationName为“add”的话,就交由addProcessor处理。
再看看addProcessor(也就是ServiceAdd的实例)里的processor方法从Exchange里的in.body里得到一个Object,根据Camel-cxf的定义,这个Object是个MessageContentsList,从这里可以拿到相应的参数p1和p2的值,处理后,将结果放到out.body里,camel-cxf的endpoint就会将它作为结果返回给调用方。
分享到:
相关推荐
【Servicemix代理Web Service】是企业级集成平台Apache Servicemix中的一个重要功能,它允许开发者通过Servicemix来代理和管理外部的Web服务。这种代理方式提供了多种优势,包括服务的路由、转换、监控以及安全性...
在本文中,我们将深入探讨如何使用Servicemix来发布一个外部的Web Service。 1. **什么是企业服务总线(ESB)?** ESB是企业级集成的核心组件,它通过中间件的方式连接不同系统,促进服务间的通信。它具有解耦、路由...
4. **CXF和Spring框架**:Apache CXF用于构建和运行Web服务,而Spring框架则提供了依赖注入和管理服务的能力,两者在ServiceMix中都扮演着重要角色。 5. **BPEL和WS-BPEL**:ServiceMix支持Business Process ...
Apache ServiceMix 基于 Java EE 平台,这意味着它可以运行各种 Java EE 应用,如Web应用、EJB、JMS消息等。这使得开发者可以利用已有的Java EE技术来构建和部署服务。 2. **Apache Camel 整合**: Apache Camel ...
在本文档中,我们将深入探讨如何使用Servicemix发布Web服务,以促进不同应用之间的数据交换和协同工作。 1. **理解ESB和Web服务**: - **ESB的角色**:ESB是企业IT架构的核心组件,用于连接各种异构系统,如数据库...
1. **消息传递**:ServiceMix基于Java Message Service(JMS)和Advanced Message Queuing Protocol(AMQP),提供可靠的消息传递机制,用于不同系统间的异步通信。 2. **服务代理**:允许用户通过Java API、SOAP或...
创建一个基于ServiceMix的Maven项目,可以使用Maven的archetype插件,如命令`mvn archetype:create -DarchetypeArtifactId=servicemix-service-unit -DarchetypeGroupId=org.apache.servicemix.tooling -...
标题 "org.apache.servicemix.bundles.aws-java-sdk-1.4.1_1.zip" 暗示了这是一个与Apache ServiceMix相关的软件包,它包含的是Amazon Web Services(AWS)的Java SDK的一个版本,具体为1.4.1。Apache ServiceMix是...
在本文中,我们将深入探讨Apache Servicemix 3的安装过程以及如何使用CXF-Bundle Component来代理WebService服务。Apache Servicemix是企业级的服务导向架构(SOA)平台,基于OSGi容器,支持多种标准如JBI、Spring、...
Web服务主要通过SOAP(Simple Object Access Protocol)协议传输数据,使用WSDL(Web Services Description Language)来描述服务,以及UDDI(Universal Description, Discovery, and Integration)用于服务的发布和...
ServiceMix是Apache软件基金会下的一个开源企业服务总线(Enterprise Service Bus, ESB)项目,它基于Java消息服务(JMS)、Java管理扩展(JMX)和Java API for RESTful Web Services(JAX-RS)等标准技术构建,提供...
ServiceMix是一款开源的企业服务总线(Enterprise Service Bus,ESB),它基于Apache Karaf容器,提供了集成不同系统和服务的能力,支持多种消息传递协议,并且具备强大的路由、转换和管理功能。在开发和部署...
1. **创建WebService服务**:用户可以轻松地在ServiceMix环境中创建WebService服务,并利用这些服务实现与其他系统的交互。 2. **创建代理**:ServiceMix支持创建多种类型的代理,包括监听外部服务请求的绑定组件...
ServiceMix基于Java执行环境(JVM),支持多种协议和标准,如Java Message Service (JMS)、Java Transaction API (JTA) 和Java API for RESTful Web Services (JAX-RS)。作为一个成熟的ESB,ServiceMix允许开发人员...
ServiceMix是基于Apache服务的开放源代码企业服务总线(ESB),它是一个灵活且可扩展的平台,用于集成各种应用程序和服务。这个框架的核心是基于Java Message Service (JMS)、Java Management Extensions (JMX) 和...
6. **RESTful API**:ServiceMix可以通过CXF等组件提供RESTful服务,使得Web应用能轻松地与服务总线进行交互。 7. **Maven集成**:ServiceMix使用Maven作为构建工具,使得依赖管理和项目构建更加便捷。 在...
2. **与 ESB 的集成**:Apache ODE 更易于与 ESB (Enterprise Service Bus) 如 ServiceMix 和 Mule 集成,这在当前 SOA 架构中非常关键。 #### 五、Apache ODE 在 SOA 架构中的角色 在 SOA 架构中,Apache ODE ...
Fuse ESB则是Red Hat公司基于Apache ServiceMix、CXF和ActiveMQ等项目的集成平台,用于构建企业级服务总线(ESB)。在本案例中,“apache-activemq-5.5-fuse-esb”可能指的是Apache ActiveMQ的一个特定版本,整合到...
7. **Service Bus**:Java SOA Cookbook可能会介绍如何使用服务总线(如Apache CXF、Apache ServiceMix或Oracle Service Bus)作为中介,来路由、转换和管理服务交互。 8. **Integration Patterns**:书中可能讨论...