1

現在、課金システムを呼び出す ProcessPayment というサービスがあります。ここでわかるように、支払いサービスから別の請求サービスに電話をかけたいと考えています。PaymentService からの応答には 3 つのデータ要素があります。いずれかが BillingService で必要です。

Mule で 2 つ以上のサービスのフローを設定するにはどうすればよいですか? いろいろな順列を試してみましたが、うまくいきません!

Mule-config.xml

 <?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core" 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" xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xmlns:ognl="http://www.mulesoft.org/schema/mule/ognl" xmlns:servlet="http://www.mulesoft.org/schema/mule/servlet"
    xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns:pattern="http://www.mulesoft.org/schema/mule/pattern"
    xsi:schemaLocation="
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/3.1/mule.xsd
        http://www.mulesoft.org/schema/mule/pattern http://www.mulesoft.org/schema/mule/pattern/3.1/mule-pattern.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/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
        http://www.mulesoft.org/schema/mule/ognl http://www.mulesoft.org/schema/mule/ognl/current/mule-ognl.xsd 
        http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd">

    <!-- <flow name="parallelservices"> <all enableCorrelation="ALWAYS"> <cxf:proxy-service 
        wsdlLocation="classpath:billingservice.wsdl" bindingId="BillingServiceServiceSoapBinding" 
        port="BillingServicePort" service="BillingServiceService" payload="body" 
        namespace="http://com.myapp.demo/" /> </all> </flow> -->

    <flow name="initpayment">
        <inbound-endpoint address="http://localhost:8585/services/processpayment">
            <cxf:proxy-service wsdlLocation="classpath:processpaymentservice.wsdl"
                bindingId="ProcessPaymentServiceServiceSoapBinding" service="ProcessPaymentServiceService"
                payload="body" namespace="http://com.myapp.demo/" />
        </inbound-endpoint>
        <outbound-endpoint address="http://localhost:8081/BillingEntry/services/BillingServicePort">
            <!-- <flow-ref name="parallelservices" /> -->
            <cxf:proxy-client/>
        </outbound-endpoint>
    </flow>

</mule>

支払い処理 wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ProcessPaymentServiceService" targetNamespace="http://processpayment.icp.sf/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.myapp.demo/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://processpayment.icp.sf/" schemaLocation="processpaymentservice_schema1.xsd"/>
</schema>
  </wsdl:types>
  <wsdl:message name="processPayment">
    <wsdl:part name="parameters" element="tns:processPayment">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="processPaymentResponse">
    <wsdl:part name="parameters" element="tns:processPaymentResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="IProcessPayment">
    <wsdl:operation name="processPayment">
      <wsdl:input name="processPayment" message="tns:processPayment">
    </wsdl:input>
      <wsdl:output name="processPaymentResponse" message="tns:processPaymentResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ProcessPaymentServiceServiceSoapBinding" type="tns:IProcessPayment">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="processPayment">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="processPayment">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="processPaymentResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ProcessPaymentServiceService">
    <wsdl:port name="ProcessPaymentServicePort" binding="tns:ProcessPaymentServiceServiceSoapBinding">
      <soap:address location="http://localhost:8081/ProcessPayment/services/ProcessPaymentServicePort"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

請求サービス wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="BillingServiceService" targetNamespace="http://com.myapp.demo2/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://billing.icp.sf/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://billing.icp.sf/" schemaLocation="billingservice_schema1.xsd"/>
</schema>
  </wsdl:types>
  <wsdl:message name="billingEntryResponse">
    <wsdl:part name="parameters" element="tns:billingEntryResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="billingEntry">
    <wsdl:part name="parameters" element="tns:billingEntry">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="IBillingService">
    <wsdl:operation name="billingEntry">
      <wsdl:input name="billingEntry" message="tns:billingEntry">
    </wsdl:input>
      <wsdl:output name="billingEntryResponse" message="tns:billingEntryResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="BillingServiceServiceSoapBinding" type="tns:IBillingService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="billingEntry">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="billingEntry">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="billingEntryResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="BillingServiceService">
    <wsdl:port name="BillingServicePort" binding="tns:BillingServiceServiceSoapBinding">
      <soap:address location="http://localhost:8081/BillingEntry/services/BillingServicePort"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

差し迫った問題

Mule 構成のインバウンド URL にアクセスすると、ProcessPayment サービスの wsdl を生成できます。しかし、それは変更された値を示しています

   <import schemaLocation="".../>

   <wsdl:port><soap:address>*****</soap:address></wsdl:port>

この URL を使用すると、SOAPui でサービスをテストできません。しかし、Mule インバウンド アドレスではなく、サービスの元のアドレスにアクセスすると、実際のサービスが提供されます。SOAP UI でも実行されます。

簡単な質問:

フローを実行するにはどうすればよいですか? ブラウザーまたは SOAPui からインバウンド URL を呼び出すだけでは正しく動作しませんか?

4

1 に答える 1

2

ここでは、CXFプロキシを使用してSOAPエンベロープレベルの操作を実行する方法を示す例を作成しました。そこから、必要なものを拡張して構築できると確信しています。

その点に注意してください:

  • コードを生成する必要はありません。実際に生成したクラスを削除する必要がありました。そうしないと、機能しません。WSDL+XSDを使用したこの単一のXML構成で十分です。
  • デフォルトの名前空間で生成された要素XSL-Tが最終的にMuleコア名前空間になるのを避けるために、Muleコア要素を修飾しました。XSLフラグメントを外部化する場合、これは必要ありません。
  • (考案された)例は、processpaymentservice.wsdlを公開します。これはpaymentType_reqの値を取り、それがIPアドレスであると偽って、それを使用してhttp://www.webservicex.net/geoipservice.asmxを呼び出します。次に、地理的に配置された国の名前が、プロセス支払い応答のpaymentType_res要素の値として使用されます(他の2つの値は偽造されます)。
  • soapUI4.5およびMule3.2.1でテスト済み。

楽しみ!

<mule:flow name="processPaymentServiceOrchestration">
    <http:inbound-endpoint address="http://localhost:8080/ppso"
        exchange-pattern="request-response">
        <cxf:proxy-service wsdlLocation="classpath:processpaymentservice.wsdl"
            service="ProcessPaymentServiceService" namespace="http://processpayment.icp.sf/" />
    </http:inbound-endpoint>

    <!-- Transform input of ProcessPayment to input of GetGeoIP -->
    <mulexml:xslt-transformer>
        <mulexml:xslt-text>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:web="http://www.webservicex.net/">
              <xsl:template match="/">
                <web:GetGeoIP>
                   <web:IPAddress><xsl:value-of select="//paymentType_req" /></web:IPAddress>
                </web:GetGeoIP>
              </xsl:template>
            </xsl:stylesheet>
        </mulexml:xslt-text>
    </mulexml:xslt-transformer>

    <mule:message-properties-transformer>
        <mule:add-message-property key="SOAPAction" value="http://www.webservicex.net/GetGeoIP" />
    </mule:message-properties-transformer>

    <http:outbound-endpoint address="http://www.webservicex.net/geoipservice.asmx"
        exchange-pattern="request-response">
        <cxf:proxy-client soapVersion="1.2" />
    </http:outbound-endpoint>

    <!-- Transform response of GetGeoIP in response of ProcessPayment -->
    <mulexml:xslt-transformer>
        <mulexml:xslt-text>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:pp="http://processpayment.icp.sf/" xmlns:web="http://www.webservicex.net/">
              <xsl:template match="/">
                <pp:return>
                   <billingID_res>fake billingID_res</billingID_res>
                   <paymentID_res>fake paymentID_res</paymentID_res>
                   <paymentType_res><xsl:value-of select="//web:CountryName"/></paymentType_res>
                </pp:return>
              </xsl:template>
            </xsl:stylesheet>
        </mulexml:xslt-text>
    </mulexml:xslt-transformer>
</mule:flow>
于 2012-04-13T00:39:28.587 に答える