我从Mule流程开始,看到我已经看到了这个页面http://www.mulesoft.org/documentation/display/MULE3CONCEPTS/Using+Mule+with+Web+Services和http://www.mulesoft.org/documentation/display/MULEWS/Consuming+SOAP+Web+Services+in+Mule这个oe。他们没有多大帮助。目前,我有一个简单的骡子流,如下所示。
流程定义
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns:cxf="http://www.mulesoft.org/schema/mule/cxf" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans" xmlns:core="http://www.mulesoft.org/schema/mule/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="CE-3.2.1"
xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/cxf http://www.mulesoft.org/schema/mule/cxf/current/mule-cxf.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
<flow name="EchoFlow" doc:name="EchoFlow">
<http:inbound-endpoint exchange-pattern="request-response"
host="localhost" port="8081" path="service/echoflow" doc:name="HTTP" />
<cxf:jaxws-client operation="" serviceClass="com.myapp.demo.ServiceAImplService"
doc:name="SOAP"/>
<outbound-endpoint address="http://localhost:8080/ServiceA/services/" doc:name="Generic"/>
</flow>
</mule>
我正在使用Mule工作室。有一个HTTP入站端点需要响应。我尝试配置一个jax-ws客户端,它将调用实际的Web服务。该服务的WSDL是:
wsdl文件
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="ServiceAImplService" targetNamespace="http://service.demo.myapp.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.demo.myapp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.demo.myapp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<import namespace="http://service.demo.myapp.com/" schemaLocation="http://localhost:8080/ServiceA/services/ServiceAImplPort?xsd=serviceaimpl_schema1.xsd"/>
</schema>
</wsdl:types>
<wsdl:message name="helloResponse">
<wsdl:part element="tns:helloResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="hello">
<wsdl:part element="tns:hello" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="IServiceA">
<wsdl:operation name="hello">
<wsdl:input message="tns:hello" name="hello">
</wsdl:input>
<wsdl:output message="tns:helloResponse" name="helloResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceAImplServiceSoapBinding" type="tns:IServiceA">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="hello">
<soap:operation soapAction="urn:Hello" style="document"/>
<wsdl:input name="hello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="helloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServiceAImplService">
<wsdl:port binding="tns:ServiceAImplServiceSoapBinding" name="ServiceAImplPort">
<soap:address location="http://localhost:8080/ServiceA/services/ServiceAImplPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
我不太确定如你所见,配置jax-ws客户端。那么,我在这个流程中如何使用SOAP Web服务呢。
我的第二个问题:如何转换有效负载以从一个Web服务调用另一个Web服务(两个SOAP)。会有什么样的流程?
最后,我如何合并有效载荷?说,我有三个并行调用的Web服务,它们的响应都返回。如何合并有效负载以便我可以在另一个服务中读取它(在合并来自并行调用的多个服务的响应之后)?
的等效实现是什么?
<pattern:web-service-proxy name="ex-proxy"
inboundAddress="http://localhost:8081/xxx"
outboundAddress="http://xx.xx.com/XXX_WS/xxxWService.asmx" />
使用CXF代理服务/客户端?这让我想到另一个问题,何时使用CXF服务以及何时使用CXF-client?最后,是否有Mule Flow Orchestration的详细文档或示例/教程?
答案 0 :(得分:2)
尝试使用CXF代理(服务和客户端)。在这种情况下,您将获得原始XML到流程中。当然,如果需要,可以将其反序列化为java,例如通过XML-To-Object转换器(XStream)。
http://www.mulesoft.org/documentation/display/MULE3USER/Proxying+Web+Services+with+CXF
从那里,有几种方法可以在中间转换有效载荷。要么通过java(如上所述)并转换java层对象,要么编写一个执行转换的XSLT表。或者使用Java和/或Mule提供的其他工具(脚本,xpath等)转换XML。
您可能希望再次详细解释聚合案例。是否要合并响应以供将来使用或进行一次Web服务调用 - &gt;扇出 - &gt;聚合 - &gt;响应?
答案 1 :(得分:1)
1)通常,您应该使用“代理服务”而不是“JAX-WS”来使用远程Web服务。
2)使用链路路由器在多个端点之间传递响应。
答案 2 :(得分:1)
如果您可以访问Web服务的服务端点接口,则可以在这样的简单Java组件中轻松使用Web服务:
public class CityServiceComponent {
public String process(String input) {
// list of cities
StringBuilder output = new StringBuilder();
// create service factory
JaxWsProxyFactoryBean serviceFactory = new JaxWsProxyFactoryBean();
// set service endpoint interface
serviceFactory.setServiceClass(CityService.class);
// set wsdl location
serviceFactory.setAddress("http://localhost:8080/city-service-provider/CityService?wsdl");
// init city service
CityService cityService = (CityService) serviceFactory.create();
// call city service and get all available cities
List<City> cities = cityService.findAll();
// build list of cities
for (City city : cities) {
output.append(city.toString());
output.append("\n");
}
// forward output message
return output.toString();
}
}
希望这会有所帮助......