MULE ESB: привязка нескольких веб-сервисов к одному клиенту - PullRequest
1 голос
/ 13 февраля 2012

У меня есть клиент, который подключается к веб-службе для получения некоторой информации.У меня есть требование, когда я должен отправить одну и ту же информацию нескольким службам через разные порты.Чтобы решить эту проблему без изменения клиентского кода, я нашел 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;
   }
}

interface:

package miniwebservice;

import javax.jws.*;

@WebService
public interface HalloWelt
{
   public String hallo( @WebParam( name = "wer" ) String wer );
}

Если я запускаю приложение Server и Mule и пытаюсь достичь http://localhost:4434/miniwebservice?wsdl ower http://localhost:4433/miniwebservice Я получаю следующее исключение в моем браузере (FireFox 8.0):

Не удалось создать сообщение SOAP из-за исключения: ошибка чтения XML: javax.xml.stream.XMLStreamException: ParseError at [row, col]: [1,1] Сообщение: содержимое не разрешено в прологе.

Я простоначал работать с мулом, поэтому я думаю, что было бы неплохо перенаправить мула в службу для получения wsdl, но это кажется немного сложным.

1 Ответ

1 голос
/ 15 февраля 2012

Отказ от ответственности:

  • Это не окончательное решение всей проблемы, которая включает в себя диспетчеризацию нескольких служб и агрегирование результатов, а шаг в правильном направлении.
  • Это не является показателем того, как проксирование веб-службы выполняется в Mule (что на намного проще ), но представляет собой простой подход к маршрутизации HTTP-запросов, поэтому можно добавить агрегацию.

Поскольку вы хотите перенаправлять запросы HTTP GET в процессор? Wsdl и запросы HTTP POST SOAP в веб-службу, вам нужно обработать целевой метод 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)

...