Service MULE ESB:将多个Web服务绑定到一个客户端

Service MULE ESB:将多个Web服务绑定到一个客户端,service,esb,mule,Service,Esb,Mule,我有一个客户端,它连接到Web服务以获取一些信息。我需要使用不同的端口向多个服务发送相同的信息。为了在不修改客户机代码的情况下解决这个问题,我找到了MULE ESB,它应该完全满足我的需要 我找到了一个指南,可以使用MULE ESB和一个端口将一个客户机连接到一个服务,但我找不到链接服务的方法,因此它们都侦听一个端口,但它们自己有不同的端口 应该是这样的: 更新: 以下是我当前的Mule应用程序配置: <mule xmlns="http://www.mulesoft.org/schema

我有一个客户端,它连接到Web服务以获取一些信息。我需要使用不同的端口向多个服务发送相同的信息。为了在不修改客户机代码的情况下解决这个问题,我找到了MULE ESB,它应该完全满足我的需要

我找到了一个指南,可以使用MULE ESB和一个端口将一个客户机连接到一个服务,但我找不到链接服务的方法,因此它们都侦听一个端口,但它们自己有不同的端口

应该是这样的:

更新:

以下是我当前的Mule应用程序配置:

<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" 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.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="flows1Flow1" doc:name="flows1Flow1">
        <http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:4433/miniwebservice" mimeType="text/xml" doc:name="HTTP"/>
        <http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:4434/miniwebservice?wsdl" mimeType="text/xml" doc:name="HTTP"/>
    </flow>
</mule>
服务器:

package miniwebservice;

import javax.xml.ws.Endpoint;

public class TestWsServer
{
   public static void main( final String[] args )
   {
      String url = ( args.length > 0 ) ? args[0] : "http://localhost:4434/miniwebservice";
      Endpoint.publish( url, new HalloWeltImpl() );
   }
}
接口EPL:

package miniwebservice;

import javax.jws.WebService;

@WebService( endpointInterface="miniwebservice.HalloWelt" )
public class HalloWeltImpl implements HalloWelt
{
   public String hallo( String wer )
   {
      return "Hallo " + wer;
   }
}
接口:

package miniwebservice;

import javax.jws.*;

@WebService
public interface HalloWelt
{
   public String hallo( @WebParam( name = "wer" ) String wer );
}
如果我启动服务器和Mule应用程序并尝试访问ower,我的浏览器(FireFox 8.0)会出现以下异常:

无法创建SOAP消息,原因是异常:XML读取器错误:javax.XML.stream.XMLStreamException:ParseError位于[row,col]:[1,1] 消息:prolog中不允许包含内容

我刚开始与Mule合作,所以我认为将Mule重定向到服务以获取wsdl是不明智的,但这似乎有点复杂。

免责声明:

  • 这并不是整个问题的最终解决方案,包括分配到多个服务和聚合结果,而是朝着正确方向迈出的一步
  • 这并不代表web服务代理是如何在Mule中完成的(Mule是),而是一种简单的HTTP请求路由方法,因此可以添加聚合
由于您希望将HTTP GET请求转发给?wsdl处理器,并将HTTP POST SOAP请求转发给web服务,因此您需要自己处理目标HTTP方法和请求URI传播:

<flow name="flows1Flow1">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:4433/miniwebservice" />
    <message-properties-transformer scope="outbound">
        <add-message-property key="http.method" value="#[header:INBOUND:http.method]" />
    </message-properties-transformer>
    <logger level="INFO" category="ddo" />
    <http:outbound-endpoint exchange-pattern="request-response"
        address="http://localhost:4434#[header:INBOUND:http.request]" />
</flow>

(使用TestWsClient和TestWsServer进行测试和验证)

免责声明:

  • 这并不是整个问题的最终解决方案,包括分配到多个服务和聚合结果,而是朝着正确方向迈出的一步
  • 这并不代表web服务代理是如何在Mule中完成的(Mule是),而是一种简单的HTTP请求路由方法,因此可以添加聚合
由于您希望将HTTP GET请求转发给?wsdl处理器,并将HTTP POST SOAP请求转发给web服务,因此您需要自己处理目标HTTP方法和请求URI传播:

<flow name="flows1Flow1">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:4433/miniwebservice" />
    <message-properties-transformer scope="outbound">
        <add-message-property key="http.method" value="#[header:INBOUND:http.method]" />
    </message-properties-transformer>
    <logger level="INFO" category="ddo" />
    <http:outbound-endpoint exchange-pattern="request-response"
        address="http://localhost:4434#[header:INBOUND:http.request]" />
</flow>


(使用TestWsClient和TestWsServer进行测试和验证)

这些web服务的性质是什么?肥皂风格?另外:Mule是否应该聚合3个调用的结果,或者选择一个,或者使用不同的远程服务作为回退(调用第1个,如果第1个关闭,则回退到第2个…)?@David Dossot我编辑了这个问题,添加了一些新信息。从目标服务URL中删除?wsdl,否则您会将所有请求通过管道传输到wsdl生成器。您认为您可以在处理SOAP信封(XML)时执行远程WS-responses聚合,还是需要处理POJO?如果XML还可以,您可能可以使用全路由消息处理器和XSL-T来解决问题。否则,您需要使用CXF在全RMP后面调用这些服务,然后使用自定义代码来聚合POJO。XML还可以,但我仍然无法让一个服务正常工作。我尝试了很多不同的方法,阅读了《测试“消费Web服务”指南》和一些使用cxf代理客户端的测试,但我无法让它工作。如果我不能让一个外部服务与mule一起工作,我就不能尝试链接多个服务。这些web服务的本质是什么?肥皂风格?另外:Mule是否应该聚合3个调用的结果,或者选择一个,或者使用不同的远程服务作为回退(调用第1个,如果第1个关闭,则回退到第2个…)?@David Dossot我编辑了这个问题,添加了一些新信息。从目标服务URL中删除?wsdl,否则您会将所有请求通过管道传输到wsdl生成器。您认为您可以在处理SOAP信封(XML)时执行远程WS-responses聚合,还是需要处理POJO?如果XML还可以,您可能可以使用全路由消息处理器和XSL-T来解决问题。否则,您需要使用CXF在全RMP后面调用这些服务,然后使用自定义代码来聚合POJO。XML还可以,但我仍然无法让一个服务正常工作。我尝试了很多不同的方法,阅读了《测试“消费Web服务”指南》和一些使用cxf代理客户端的测试,但我无法让它工作。如果我不能得到一个外部服务与骡子我不能尝试连锁多个服务。