6

これは質問ではなく、答えです。私は wso2 ESB にまったく慣れていないので、POC の一部としてスプリット/ギャザー EIP を実装してテストを実行したいと考えていました。見つけた例に従い、すぐに単一の応答を返す有効な構成を取得しました。ただし、すべての応答を取得するには、理解するのにかなりの時間がかかりました。与えられたほとんどのサンプルは、同じ予期しない結果を生み出すように見えました。同じ種類の問題に遭遇した場合、これらの行が役立つことを願っています.

設定

サービスバックエンドとしてsoapUIのサンプルサービス(検索操作)を利用しました。2 つのアイテムを検索する結合メッセージをプロキシ サーバーに送信しました (以下のアーティファクトを参照)。反復メディエーターはメッセージを分割し、soapUI モックアップを呼び出しているエンドポイントに転送します。集約メディエーターはすべての応答を待ち、それを 1 つの結果メッセージに入れようとします。

問題

スプリッターは正しく機能していましたが、アグリゲーターは、期待どおりの要素のリストではなく、1 つの結果要素のみを返しました。すべてのログは、すべてが正常であることを示しており、いくつかのリクエストが対応するエンドポイントに送信されましたが、返された最初のレスポンスのみが最終レスポンスに表示されました。

解決

プロキシのログ レベルを TRACE に設定した後、アグリゲータが正常に機能していることに気付きましたが、実際には SOAP に準拠していないメッセージを作成しただけでした。すべての集合要素は、石鹸本体の直下に追加されました。そこで問題は、body タグと result タグの間にルート要素を 1 つ追加する方法でした。最初に XSLT を試してみましたが、本体の最初の子要素しか読み取れませんでした。最後に、enrich メディエーター(または一連のメディエーター) を使用するための深く埋もれたヒントを見つけ、それでうまくいきました。次のリストは、ほとんどの例で見つからない構成 (以下に示すコード) の部分を説明しています。

  1. 最初の強化を使用して、関連するすべてのアイテムをプロパティに取り込みます
  2. 現在のメッセージを忘れる - 新しいペイロード ルート要素のみを含む本文で完全なエンベロープを書き換えます
  3. プロパティに格納されている要素を新しいペイロード ルートにアタッチします。
  4. 必要に応じて、soap ヘッダーをプロパティにキャプチャし、新しいメッセージに添付します (以下の構成にはありません)。

アーティファクト

デモリクエスト

<body>
   <sam:multisearch xmlns:sam="http://www.example.org/sample/">
      <sam:search>
         <sessionid>123</sessionid>
         <searchstring>Item 1</searchstring>
      </sam:search>
      <sam:search>
         <sessionid>123</sessionid>
         <searchstring>Item 2</searchstring>
      </sam:search>
   </sam:multisearch>
</body>

設定

<proxy xmlns="http://ws.apache.org/ns/synapse" name="test.multisearch" transports="https,http" statistics="enable" trace="enable" startOnLoad="true">
   <target>
      <inSequence>
         <iterate xmlns:sam="http://www.example.org/sample/" expression="//sam:multisearch/sam:search">
            <target>
               <sequence>
                  <send>
                     <endpoint key="soapUI_Mockup"/>
                  </send>
               </sequence>
            </target>
         </iterate>
      </inSequence>
      <outSequence>
         <aggregate>
            <completeCondition>
               <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/" expression="//sam:searchResponse">
               <enrich>
                  <source clone="true" xpath="$body//item"/>
                  <target type="property" property="ResultItems"/>
               </enrich>
               <log level="custom">
                  <property name="ResultItems" expression="get-property('ResultItems')"/>
               </log>
               <enrich>
                  <source type="inline" clone="true">
                     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">                        
                        <soapenv:Header/>                        
                        <soapenv:Body>                           
                           <sam:GenericDataResponse/>                        
                        </soapenv:Body>                     
                     </soapenv:Envelope>
                  </source>
                  <target type="envelope"/>
               </enrich>
               <enrich>
                  <source type="property" clone="true" property="ResultItems"/>
                  <target action="child" xpath="//sam:GenericDataResponse"/>
               </enrich>
               <send/>
            </onComplete>
         </aggregate>
      </outSequence>
   </target>
   <description></description>
</proxy>

最後に質問です

誰かが私にいくつかのドキュメントを教えてくれたり、集計メディエーターのcorrelateOn属性の動作する設定を教えてくれたりしたら、本当に感謝しています。

4

2 に答える 2

1

あなたがする必要があるのは、イテレーターメディエーターで任意の ID を言及し (イテレーターメディエーターのドキュメントを参照)、アグリゲーターメディエーターで相関 ID として同じ ID を参照することです。それでおしまい。–</p>

于 2013-07-28T13:13:02.237 に答える