Как использовать веб-службу SOAP в Mule Flow?

Я начинаю с потоков 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 это тоже. Они не очень помогли. В настоящее время у меня есть простой поток мулов, как показано ниже.

Определение потока

<?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, который будет вызывать реальную веб-службу. 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 в этом потоке.


Мой второй вопрос: как мне преобразовать полезную нагрузку, чтобы сделать вызов из одной веб-службы в другую веб-службу (оба SOAP). Какой будет поток?


И, наконец, как мне объединить полезные нагрузки? Скажем, у меня есть три веб-службы, вызываемые параллельно, и все их ответы возвращаются вместе. Как объединить полезные данные, чтобы их можно было прочитать в другой службе (после объединения ответов от нескольких служб, вызываемых параллельно)?



Какова эквивалентная реализация

       <pattern:web-service-proxy name="ex-proxy"
        inboundAddress="http://localhost:8081/xxx"
        outboundAddress="http://xx.xx.com/XXX_WS/xxxWService.asmx" /> 

используя прокси-сервис/клиент CXF? И это подводит меня к другому вопросу, когда использовать CXF-сервис и когда использовать CXF-клиент? И, наконец, есть ли подробная документация или пример/руководство по Mule Flow Orchestration?


person r3st0r3    schedule 07.04.2012    source источник
comment
Ответ @Petter дает вам хорошие подсказки. В вашем вопросе неясно одно: хотите ли вы раскрыть весь сервис? Как еще один веб-сервис или просто как простой HTTP-ресурс (как показано в вашем примере)?   -  person David Dossot    schedule 10.04.2012
comment
Я в курсе компонентов. Однако я не могу правильно их настроить, потому что нет надлежащей документации/примера! Простой пример прокси CXF мне очень поможет. Я никогда не прошу код, но я застрял с этим на одну неделю без какого-либо прогресса!   -  person r3st0r3    schedule 11.04.2012
comment
Я вижу, что атрибут операции jaxws-client равен , что не может быть правильным. Вы пробовали вместо этого использовать hello? Какая у вас ошибка?   -  person David Dossot    schedule 11.04.2012
comment
Что ж, с тех пор я перешел к более разумному примеру (не одному из тех спагетти ServiceA ServiceB). Кроме того, я последовал совету @petter и собираюсь использовать прокси с использованием CXF. Но один взгляд на эту страницу mulesoft.org/documentation/ display/MULE3USER/ и я снова потерялся! Я обновляю вопрос.   -  person r3st0r3    schedule 11.04.2012
comment
cxf:jaxws-service предназначен для предоставления веб-сервисов в Mule из аннотированных классов JAX-WS/JAXB. cxf:jaxws-client предназначен для использования удаленных веб-служб, привязывающих их к аннотированным классам JAX-WS/JAXB.   -  person David Dossot    schedule 11.04.2012
comment
Посмотрите на простой пример с кредитным брокером для примера оркестровки службы.   -  person David Dossot    schedule 11.04.2012


Ответы (3)


Попробуйте использовать прокси-сервер CXF (сервис и клиент). В этом случае вы получите необработанный XML в поток. Конечно, вы можете десериализовать его в java, если вам нужно, например, с помощью преобразователя XML-To-Object (XStream).

http://www.mulesoft.org/documentation/display/MULE3USER/Proxying+Web+Services+with+CXF

Оттуда есть несколько способов преобразовать полезную нагрузку в середине. Либо пройдите java (как упоминалось выше) и преобразуйте объекты слоя java, либо напишите лист XSLT, который выполняет преобразование. Или преобразуйте XML с помощью Java и / или других инструментов, предоставляемых Mule (скрипты, xpath и т. д.).

Возможно, вы захотите еще раз подробно объяснить случай агрегации. Вы хотите объединить ответы для будущего использования или иметь один вызов веб-службы -> разветвление -> объединение -> ответ?

person Petter Nordlander    schedule 08.04.2012
comment
Что, если вы хотите предоставить начальное подтверждение, а затем продолжить с данными, полученными из запроса? - person Coova; 03.03.2017
comment
Может быть, это другой вопрос. Но обычно вызывают некоторый асинхронный процесс, такой как vm-endpoint, очередь, асинхронная область и т. д., прежде чем возвращать ответ. Выполните дальнейшую обработку в асинхронном/отдельном потоке. - person Petter Nordlander; 06.03.2017

1) Как правило, вы должны использовать «Прокси-сервис» вместо «JAX-WS» для использования удаленного веб-сервиса.

2) Используйте цепные маршрутизаторы для передачи ответов между несколькими конечными точками.

person babybug    schedule 08.04.2012

Если у вас есть доступ к интерфейсу конечной точки службы веб-службы, вы можете легко использовать веб-службу в простом Java-компоненте, например:

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

    }

}

Надеюсь это поможет...

person Pascal    schedule 26.06.2012