HTTP Polling ソースの設定

HTTP Connector 用 Anypoint Connector (HTTP Connector) では、指定された HTTP サーバーに対して、スケジュールされた HTTP 要求を実行する ​Polling Source​ イベントソースが提供されます。このソースでは、HTTP ​Listener​ ソースのようにユーザーからの HTTP 要求を待機しません。

HTTP ​Polling Source​ イベントソースでは、以下を設定できます。

  • スケジュール頻度 (一定期間または Cron 式)。

  • 応答の各項目がフローの異なる実行で実行されるように HTTP 応答を分割するイベントソース。

  • ウォーターマークを取得する方法。

HTTP Request 操作とのリレーション

HTTP ​Polling Source​ イベントソースは HTTP 要求 (HTTP ​Request​ 操作など) を実行するため、HTTP 要求グローバル設定 (URL、ポート、ベースパス、プロトコルの設定や、各自の実装で要求されるカスタム要求設定など) を使用してソースを設定します。

このソースは HTTP 要求を実行し、結果として得られる HTTP 応答を使用して、フローをトリガーする 1 つ以上のイベントを作成します。

次の設定例は、10 時間ごとにポーリングするポーリングソースを示しています。

Anypoint Studio の [HTTP Polling source (HTTP Polling ソース)] 設定ウィンドウ

[Configuration XML (設定 XML)]​ ビューでは、​<http:request-config>​、​<http:polling-source>​、​<scheduling-strategy>​ 設定は次のように記述されます。

<http:request-config name="requestConfig">
    <http:request-connection host="localhost" port="8081"/>
</http:request-config>

<flow name="example-polling-source">
    <http:polling-source config-ref="requestConfig" path="/test">
        <scheduling-strategy >
            <fixed-frequency frequency="10" timeUnit="HOURS"/>
         </scheduling-strategy>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml

ポーリング頻度の設定

[Scheduling strategy (スケジュール戦略)]​ (​<scheduling-strategy>​) 項目で、一定間隔または Cron 式としてスケジュール戦略を設定します。

[Configuration XML (設定 XML)]​ エディターでは、​<scheduling-strategy>​ および ​<cron>​ 設定は次のように記述されます。

<flow name="example-polling-source">
    <http:polling-source config-ref="requestConfig" path="/test">
        <scheduling-strategy>
            <cron expression="0/1 * * * * ?"/>
        </scheduling-strategy>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml

パラメーターの設定

HTTP ​Polling Source​ イベントソースでも、HTTP ​Request​ 操作と同じ方法で本文、ヘッダー、URI、パラメーター、クエリパラメーターを設定できます。

次の例は、値を使用して ​[Body (本文)]​ (​polling-request-body​)、​[Headers (ヘッダー)]​ (​polling-request-headers​)、​[URI parameters (URI パラメーター)]​ (​polling-request-uri-param​)、​[Query parameters (クエリパラメーター)]​ (​polling-request-query-param​) 項目を設定する方法を示しています。これには、式を追加することができます。これらの式はウォーターマークに連動できます。

[Configuration XML (設定 XML)]​ エディターでは、​polling-request-body​、​polling-request-headers​、​polling-request-uri-param​、​polling-request-query-param​ 設定は次のように記述されます。

<flow name="basic-polling-full-params">
    <http:polling-source config-ref="requestConfig" path="/{testPath}">
        <scheduling-strategy >
            <fixed-frequency frequency="2" timeUnit="SECONDS"/>
        </scheduling-strategy>
        <http:polling-request-body ><![CDATA[{'someBodyValue': 10}]]></http:polling-request-body>
        <http:polling-request-headers >
            <http:polling-request-header key="content" value="application/json" />
            <http:polling-request-header key="testHeader" value="Messi" />
        </http:polling-request-headers>
        <http:polling-request-uri-params >
            <http:polling-request-uri-param key="testPath" value="test" />
        </http:polling-request-uri-params>
        <http:polling-request-query-params >
            <http:polling-request-query-param key="testQueryParam" value="parameter value" />
        </http:polling-request-query-params>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml

分割式の設定

HTTP ​Polling Source​ イベントソースが HTTP 要求を実行して HTTP 応答を取得したら、変換を実行し、その応答の各項目をフローの異なる実行で実行されるように HTTP 応答を分割できます。

たとえば、データベースからそのデータを取得するサーバーをポーリングし、そのサーバーから 50 件の結果が返されるとします。フロー間で応答を分割せず、​For each​ コンポーネントを使用しないで各結果を個別にフローに送信したいと考えています。応答を分割するには、​[Split expression (分割式)]​ (​splitExpression​) 項目を設定します。

HTTP ​Request​ 操作の後に参照するため、分割式では応答を​ペイロード​として参照します。

次の例は、項目が配列に含まれる JSON ペイロードを返すサーバーを示しています。​set-payload​ コンポーネント設定は次の記述されます。

<flow name="jsonListenerFlow">
    <http:listener config-ref="listenerConfig" path="/json"/>
    <set-payload value="#[output application/json --- [{'name': 'Mondi'}, {'name': 'Viena'}]]"/>
</flow>
xml

このケースでは、配列を分割する対応する式は ​#[payload]​ になります。分割式では、参照される​ペイロード​は、すでに JSON ファイルとして処理されている応答全体になります。一方、​logger​ プロセッサーで参照される​ペイロード​は、その実行の対応するペイロード (​{'name': 'Mondi'}​ のペイロードと ​{'name': 'Viena'}​ のペイロード) を参照します。​splitExpression​ 設定は次の記述されます。

<flow name="jsonPollingFlow">
    <http:polling-source config-ref="requestConfig" path="json" splitExpression="#[payload]">
        <scheduling-strategy>
            <fixed-frequency frequency="10" timeUnit="SECONDS"/>
        </scheduling-strategy>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml

次の例は、1 つのポーリングの後のフローの 2 つの同時実行 (​<name>Mondi</name>​ を使用する実行と ​<name>Viena</name>​ を使用する実行) を示しています。10 時間後、ポーリングが再度実行されます。の例では、サーバーは同じ結果を返します。

<flow name="xmlListenerFlow">
    <http:listener config-ref="listenerConfig" path="/xml"/>
    <set-payload value="#[output application/xml --- {'something': {'element': [{name: 'Mondi'}, {name: 'Viena'}]}}]"/>
</flow>

<flow name="xmlPollingFlow">
    <http:polling-source config-ref="requestConfig" path="xml"
        splitExpression="#[payload.something.*element]">
        <scheduling-strategy>
            <fixed-frequency frequency="10" timeUnit="HOURS"/>
        </scheduling-strategy>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml

ウォーターマーク式の設定

前の簡単な例では、サーバーは常に同じ HTTP 応答を返します。より複雑なシナリオでは、サーバーは次の応答を送信する必要があるかどうかを把握する必要があります。ヘッダー、URI パラメーター、本文、またはクエリパラメーターを送信できますが、これらのパラメーターに常に HTTP 要求と同じ値が含まれている場合、サーバーは次の応答を把握できません。

このようなポーリングシナリオでは、サーバーがペイロード全体のウォーターマーク値を返すか、そのペイロードの各項目のウォーターマーク値を個別に返すウォーターマークを実装します。たとえば、ウォーターマーク値は、コレクション全体を参照するタイムスタンプになるか、各項目のそれぞれのタイムスタンプになります。いずれの場合も、​watermark​ プレースホルダーを使用して、ウォーターマーク式を指定します。

式によって応答からウォーターマークが抽出され、その後にこのウォーターマークを使用して要求がサーバーに送信されます。​watermark​ プレースホルダーには、本文、ヘッダー、URI パラメーター、クエリパラメーター値の式を使用できます。

最初に式の ​watermark​ プレースホルダー値は ​null​ です。これは、プレースホルダーが使用されるサーバーまたは式で考慮される必要があります。

ウォーターマーク式でペイロード全体を参照するには、​payload​ プレースホルダーを使用します。項目を参照するには、ウォーターマーク式の各項目に個別に適用される ​item​ プレースホルダーを使用します。

次の XML 設定例は、HTTP ​Listener​ フローを示しています。最初のポーリングのやりとりでウォーターマークがない場合、​wm​ プロパティにウォーターマーク値が設定されたペイロードが返されます。2 番目のポーリングのやりとりでは、ウォーターマーク値が想定されるため、ペイロードが異なっています。このケースでは、要求のペイロードから取得されます。

<flow name="watermarkInPayloadListenerFlow">
    <http:listener config-ref="watermarkListenerConfig" path="/watermark-payload"/>
    <choice>
        <when expression="#[payload.watermark == null]">
            <set-payload value="#[output application/json --- {'items': [{'name': 'Eze'}, {'name': 'Fabi'}, {'name': 'Sofi'}], 'wm': 0}]"/>
        </when>
        <when expression="#[payload.watermark == '0']">
            <set-payload value="#[output application/json --- {'items': [{'name': 'Euge'}, {'name': 'Juli'}], 'wm': 1}]"/>
        </when>
        <when expression="#[payload.watermark == '1']">
            <set-payload value="#[output application/json --- {'items': [{'name': 'Pablo'}, {'name': 'Martín'}], 'wm': 2}]"/>
        </when>
        <otherwise>
            <set-payload value="#[output application/json --- {'items': [], 'wm': 3}]"/>
        </otherwise>
    </choice>
</flow>
xml

次の XML 設定例は、ペイロード全体からウォーターマーク値を抽出し、要求の本文の値を使用する方法を示しています。この設定では、HTTP ​Listener​ ソースではなく HTTP ​Polling Source​ イベントソースを使用します。

<flow name="watermarkInPayloadPollingFlow">
    <http:polling-source config-ref="watermarkRequestConfig" path="watermark-payload"
        splitExpression="#[payload.items]" watermarkExpression="#[payload.wm]">
        <scheduling-strategy>
            <fixed-frequency frequency="5" timeUnit="MINUTES"/>
        </scheduling-strategy>
        <http:polling-request-body><![CDATA[#[output application/json --- {'watermark': watermark}]]]></http:polling-request-body>
        <http:polling-request-headers >
            <http:polling-request-header key="Content-Type" value="application/json" />
        </http:polling-request-headers>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml
  • watermarkExpression​ には、応答のプロパティ ​wm​ からウォーターマークを取得する ​watermark​ プレースホルダーがあります。

  • 最初のポーリングのやりとりには、フローの 3 つの実行 (​{name: 'Eze'}​ を使用する実行、​{name: 'Fabi'}​ を使用する実行、​{name: 'Sofi'}​ を使用する実行) があります。

  • 5 分後に発生する 2 番目のポーリングのやりとりには、2 つの実行 (​{name: 'Euge'}​ を使用する実行と ​{name: 'Juli'}​ を使用する実行) があります。

  • 5 分後に発生する 2 番目のポーリングのやりとりには、2 つの実行 (​{name: 'Euge'}​ を使用する実行と ​{name: 'Juli'}​ を使用する実行) があります。

  • その後、3 番目のやりとりでもポーリングは続行されますが、結果が空であるため、フローの実行はありません。

次の XML 設定例は、各項目からウォーターマーク値を抽出し、クエリパラメーターでその値を使用する方法を示しています。動作は、HTTP サーバーでのウォーターマーク値の使用方法に完全に連動します。

羃等性式の設定

同じペイロード ID のフローが 2 つ同時に実行されないようにするには、HTTP ​Polling Source​ イベントソースの羃等性を設定します。この設定により、同じ ID のペイロードが同時に処理されなくなります。

イベントソースの羃等性を設定するには、ウォーターマーク式の設定と同様に、項目から ID を取得する ID 式を追加します。羃等性式 ​idExpression​ で ​payload​ および ​item​ プレースホルダーを使用します。

次の XML 設定例では、最初の 3 つの項目でフローが同時に実行され、最初の項目の処理が完了した後に 4 番目の項目のプロセスが開始されます。

<flow name="identityWithoutWatermarkListenerFlow">
    <http:listener config-ref="watermarkListenerConfig" path="/identity-no-watermark"/>
    <set-payload value="#[output application/json --- {'items': [{'name': 'Rodro', 'value': 5}, {'name': 'Eze', 'value': 8}, {'name': 'MG', 'value': 7}, {'name': 'Rodro', 'value': 14}]}]"/>
</flow>

<flow name="identityWithoutWatermarkPollingFlow">
    <http:polling-source config-ref="watermarkRequestConfig" path="identity-no-watermark"
        splitExpression="#[payload.items]" idExpression="#[item.name]">
        <scheduling-strategy>
            <fixed-frequency frequency="1" timeUnit="HOURS"/>
        </scheduling-strategy>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml

応答バリデーターの設定

応答バリデーターを設定して使用することで、受け取った応答を検証します。

次の XML 設定例は、応答バリデーターでデフォルトの状況コード (200 ~ 299) が想定されるときに、サーバーから常に 301 コードが返されて HTTP 応答が必ず失敗する状況を示しています。これは、フローが実行されず、応答バリデーターで状況コードとして 301 が定義されている場合にのみがペイロードが有効とみなされる (その後、分割、ウォーターマーク、羃等性設定が適用される) ことを示しています。

<flow name="responseErrorListenerFlow">
    <http:listener config-ref="responseListenerConfig" path="/response-error">
        <http:response statusCode="301"/>
    </http:listener>
    <set-payload value="#[output application/json --- [{'name': 'ex1'}, {'name': 'ex2'}, {'name': 'ex3'}]]"/>
</flow>

<flow name="responseErrorPollingFlow">
    <http:polling-source config-ref="responseRequestConfig" path="response-error"
        splitExpression="#[payload]">
        <scheduling-strategy>
            <fixed-frequency frequency="10" timeUnit="SECONDS"/>
        </scheduling-strategy>
        <http:response-validator>
            <http:success-status-code-validator values="200..299" />
        </http:response-validator>
    </http:polling-source>
    <logger message="#[payload]"/>
</flow>
xml