2017-02-07 15 views
0

私は現在、シーケンステンプレートから集約要素のペイロードを計算しようとしています。私の問題は、このシーケンスによって返されたペイロードは、ペイロードファクトリを持つビルドではなく、集約によって生成されたペイロードであるということです。ここにサンプルがあります。WSO2がペイロードの総計を

このシーケンスを呼び出すと、元に戻って(集約されて)得ると思います。 どうすればこの問題を解決できますか?あなたはクローン後のメディエーターを実行したい場合は

おかげ

答えて

2

は、あなたはクローンメディエーターに属性continueParent =「true」を設定する必要があります。

しかし、クローンメディエータの後にクローンのターゲットに生成されたメッセージが失われるため、これでは不十分です。集約メディエータをシーケンス内で移動し、各クローンのターゲット内部でこのシーケンスを呼び出す必要があります。ログインして、模擬応答

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="TestSOF" 
     transports="http" 
     startOnLoad="true" 
     trace="disable"> 
    <description/> 
    <target> 
     <inSequence> 
     <property name="messageType" value="application/xml" scope="axis2"/> 
     <clone continueParent="true"> 
      <target> 
       <sequence> 
        <payloadFactory media-type="xml"> 
        <format> 
         <resp1 xmlns=""> 
          <status>OK</status> 
         </resp1> 
        </format> 
        <args/> 
        </payloadFactory> 
        <header name="To" action="remove"/> 
        <property name="RESPONSE" value="true"/> 
        <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
        <sequence key="TestSOFAgg"/> 
       </sequence> 
      </target> 
      <target> 
       <sequence> 
        <payloadFactory media-type="xml"> 
        <format> 
         <resp2 xmlns=""> 
          <status>OK</status> 
         </resp2> 
        </format> 
        <args/> 
        </payloadFactory> 
        <header name="To" action="remove"/> 
        <property name="RESPONSE" value="true"/> 
        <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
        <sequence key="TestSOFAgg"/> 
       </sequence> 
      </target> 
     </clone> 
     <log level="full"> 
      <property name="DEBUG" value="after clone"/> 
     </log> 
     </inSequence> 
    </target> 
</proxy> 
<sequence xmlns="http://ws.apache.org/ns/synapse" name="TestSOFAgg"> 
    <aggregate> 
    <completeCondition> 
     <messageCount max="-1" min="-1"/> 
    </completeCondition> 
    <onComplete expression="//status"> 
     <log level="full"><property name="DEBUG" value="inside onComplete"/></log> 
     <filter xpath="count(//status[text() = 'NOK']) = 0"> 
      <then> 
      <payloadFactory media-type="xml"> 
       <format> 
       <myPayload> 
        <status>OK</status> 
        <action>foo</action> 
       </myPayload> 
       </format> 
       <args/> 
      </payloadFactory> 
      </then> 
      <else> 
      <payloadFactory media-type="xml"> 
       <format> 
       <myPayload> 
        <status>NOK</status> 
        <action>bar</action> 
       </myPayload> 
       </format> 
       <args/> 
      </payloadFactory> 
      </else> 
     </filter> 
     <respond/> 
     </onComplete> 
    </aggregate> 
</sequence> 

参照メッセージを集約するために使用されるシーケンス:ここ

プロキシサービス(http://localhost:8280/services/TestSOFあなたは、単にあなたのインターネットブラウザで実行できること)で構成されるサンプルを来ります"クローン後":ソープボディが空です(ブラウザを使ってテストした場合、またはSoapUIで送信したメッセージがあります)

「onCompleteの内側」によって記録されたメッセージを参照してください:あなたは石鹸ボディ

修正何か他のものとモックのいずれかの応答内のすべてのステータス要素を見ることができるOKして、やり直してください:応答変化は、それが;-)

の作品
+0

あなたの答えをありがとう、continueParent = "true"と設定した場合、クローンの終わりにクローンシーケンスの結果を得ることができません。別のコールの前にペイロードを保存します。私は各クローン要素の内部を集約しようとしますが、すべてのシーケンスが完了したときに集約が1回だけ行われるべきであると私が常に理解している限り、どちらも論理的でも自然でもありません。 – Nicolas

+0

間違った集約メディエータはreponsesと同じ回数だけ呼び出さなければなりません。これはcompleteConditionのmessageCountの理由です:ESBが2つのターゲットがインスタンス化されていることを知っているので、-1をクローンメディエータと設定できます。 completeConditionが真(仲介メディエータが呼び出された最後の時刻)のとき、 "onComplete"部分が実行されます –

+0

私はいくつかのテストを行いましたが、集計からペイロードを取得することはありません。元のペイロード。理由は私がプロキシではなく、通常の順序でこれを使用しているということでしょうか? – Nicolas