Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerHTTP Connector 用 Anypoint Connector (HTTP Connector) では、指定された HTTP サーバーに対して、スケジュールされた HTTP 要求を実行する Polling Source イベントソースが提供されます。このソースでは、HTTP Listener ソースのようにユーザーからの HTTP 要求を待機しません。
HTTP Polling Source イベントソースでは、以下を設定できます。
スケジュール頻度 (一定期間または Cron 式)。
応答の各項目がフローの異なる実行で実行されるように HTTP 応答を分割するイベントソース。
ウォーターマークを取得する方法。
HTTP Polling Source イベントソースは HTTP 要求 (HTTP Request 操作など) を実行するため、HTTP 要求グローバル設定 (URL、ポート、ベースパス、プロトコルの設定や、各自の実装で要求されるカスタム要求設定など) を使用してソースを設定します。
このソースは HTTP 要求を実行し、結果として得られる HTTP 応答を使用して、フローをトリガーする 1 つ以上のイベントを作成します。
次の設定例は、10 時間ごとにポーリングするポーリングソースを示しています。
[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 サーバーでのウォーターマーク値の使用方法に完全に連動します。
<flow name="watermarkIntoQueryParamsListenerFlow">
<http:listener config-ref="watermarkListenerConfig" path="/watermark-into-query"/>
<choice>
<when expression="#[attributes.queryParams.watermark == '0']">
<set-payload value="#[output application/json --- {'items': [{'name': 'Rodro', 'wm': 1}, {'name': 'Steve', 'wm': 2}, {'name': 'Juan', 'wm': 3}]}]"/>
</when>
<when expression="#[attributes.queryParams.watermark == '2']">
<set-payload value="#[output application/json --- {'items': [{'name': 'Axel', 'wm': 4}, {'name': 'Mariano', 'wm': 5}]}]"/>
</when>
<when expression="#[attributes.queryParams.watermark == '5']">
<set-payload value="#[output application/json --- {'items': [{'name': 'Ivan', 'wm': 6}, {'name': 'Hyeran', 'wm': 7}]}]"/>
</when>
<otherwise>
<set-payload value="#[output application/json --- {'items': []}]"/>
</otherwise>
</choice>
</flow>
<flow name="watermarkIntoQueryParamsPollingFlow">
<http:polling-source config-ref="watermarkRequestConfig" path="watermark-into-query"
splitExpression="#[payload.items]" watermarkExpression="#[item.wm]">
<scheduling-strategy>
<fixed-frequency frequency="1" timeUnit="SECONDS"/>
</scheduling-strategy>
<http:polling-request-query-params >
<http:polling-request-query-param key="watermark" value="#[watermark default 0]" />
</http:polling-request-query-params>
</http:polling-source>
<logger message="#[payload]"/>
</flow>
xml
同じペイロード 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