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

时间:2012-02-13 09:47:36

标签: service esb mule

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

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

这应该是这样的: Conceptual Diagram

更新:

这是我当前的Mule Applications配置:

<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>

这是WebService:

客户:

package miniwebservice;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class TestWsClient
{
   public static void main( final String[] args ) throws Throwable
   {
      String url = ( args.length > 0 ) ? args[0] : "http://localhost:4434/miniwebservice";
      Service service = Service.create(
            new URL( url + "?wsdl" ),
            new QName( "http://miniwebservice/", "HalloWeltImplService" ) );
      HalloWelt halloWelt = service.getPort( HalloWelt.class );
      System.out.println( "\n" + halloWelt.hallo( args.length > 1 ? args[1] : "" ) );
   }
}

服务器:

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() );
   }
}

InterfaceImpl:

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应用程序并尝试访问http://localhost:4434/miniwebservice?wsdl ower http://localhost:4433/miniwebservice我在浏览器中获得了以下异常(FireFox 8.0):

由于异常而无法创建SOAP消息:XML reader错误:javax.xml.stream.XMLStreamException:[row,col]处的ParseError:[1,1] 消息:prolog中不允许使用内容。

我刚开始和骡子一起工作,所以我觉得这样做是为了让重定向骡子到服务部来获得wsdl,但它看起来有点复杂。

1 个答案:

答案 0 :(得分:1)

免责声明:

  • 这不是整个问题的最终解决方案,包括调度到多个服务和汇总结果,但是朝着正确的方向迈出了一步。
  • 这并不代表如何在Mule(way simpler)中完成Web服务代理,而是代表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测试和验证)