FTP サーバーへの動的な接続の例 - Mule 4

多くのインテグレーションでは、次のように特定の条件に応じて異なるサーバーへの接続が必要です。

  • 請求書を送信する部署に応じて異なる請求書ストレージサーバーに接続する。

  • マルチテナントのユースケースなど、インテグレーションの対象に応じて異なるサーバーに接続する。

こうしたユースケースに対応するため、​config​ 要素では、これらの条件を評価して適切なサーバーに接続するパラメーター式がサポートされています。

次の例は、以下に該当する動的マルチキャストアプリケーションの例を示しています。

  • host​、​username​、​password​ が式になっているコネクタの設定を定義する。

  • HTTP 経由でコンテンツを投稿するフロー (​HTTP Listener​ によってトリガーされる) を記述する。

  • File Connector の ​Read​ 操作を使用して、​host​、​user​、​port​ などの列で構成される FTP 宛先セットを含む ​recipients.csv​ ファイルを読み込む。

  • [For Each]​ コンポーネントと FTP の ​Write​ 操作を使用して、コンテンツを各 FTP 宛先に書き込む。​[For Each]​ の反復ごとに、FTP グローバル設定要素で設定された式が異なる値に解決され、サーバーごとに異なる接続が確立されます。

この例をテストするには、Mule アプリケーションを作成して、curl コマンドを使用して実行します。

Studio キャンバスでの FTP サーバーの動的な接続フロー

Mule アプリケーションの作成

Mule アプリケーションフローを作成する手順は、次のとおりです。

  1. [Mule Palette (Mule パレット)]​ ビューで、​[HTTP] > [Listener]​ を選択します。

  2. [HTTP] の [Listener]​ を Studio キャンバスにドラッグします。

  3. [HTTP Listener (HTTP リスナー)]​ 設定画面で、必要に応じて ​[Display Name (表示名)]​ 項目の値を変更します。

  4. [Path (パス)]​ を ​/multitenant​ に設定します。

  5. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の HTTP Listener のすべてのインスタンスで使用できるグローバル要素を設定します。

  6. [General (一般)]​ タブで、次の項目を設定します。

    • Host (ホスト)​: All Interfaces [0.0.0.0] (default)

    • Port (ポート)​: 8081

  7. [OK]​ をクリックします。

  8. [Set Variable]​ コンポーネントを ​[HTTP] の [Listener (リスナー)]​ ソースの右にドラッグします。

  9. [Name (名前)]​ を ​content​ に、​[Value (値)]​ を ​#[payload]​ に設定します。

  10. File Connector の ​[Read]​ 操作を ​[Set Variable]​ コンポーネントの右にドラッグします。

  11. [File Path (ファイルパス)]​ を ​recipients.csv​ に設定します。これにより、​host​、​user​、​port​ などの列で構成されるランダムな FTP 宛先セットを含む CSV ファイルが読み取られます。

  12. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の File Connector のすべてのインスタンスで使用できるグローバル要素を設定します。

  13. デフォルト設定を受け入れ、​[OK]​ をクリックします。

  14. Read​ 操作の ​[MIME Type (MIME タイプ)]​ タブの ​[MIME Type (MIME タイプ)]​ で ​[application/csv]​ を選択します。

  15. Studio で、​[Transform Message]​ コンポーネントを ​[Read]​ 操作の右にドラッグします。

  16. コンポーネントの ​[Output (出力)]​ セクションで、次の DataWeave コードを追加して、CSV ファイルの列にマップします。

    DataWeave スクリプト:
    %dw 2.0
    output application/java
    ---
    payload map using (row = $) {
       host: row.Host,
       user: row.User,
       password: row.Password}
  17. [For Each]​ コンポーネントを ​[Transform Message]​ コンポーネントの右にドラッグします。

  18. FTP の ​[Write]​ 操作を ​[For Each]​ コンポーネントにドラッグします。
    For Each の反復ごとに、​Write​ 操作は、コンテンツを各 FTP 宛先に書き込みます。

  19. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の FTP の ​Write​ 操作のすべてのインスタンスで使用できるグローバル要素を設定し、次の項目を設定します。

    • Host (ホスト)​: #[payload.host]

    • Username (ユーザー名)​: #[payload.username]

    • Password (パスワード)​: #[payload.password]

  20. [OK]​ をクリックします。

  21. [Path (パス)]​ を ​demo.txt​ に設定します。

  22. [Content (コンテンツ)]​ 項目を ​payload​ に設定します。

  23. [Set Payload]​ コンポーネントを ​[For Each]​ コンポーネントの右にドラッグします。

  24. [Value (値)]​ 項目を ​Multicast Ok​ に設定します。

Mule アプリケーションの実行およびテスト

Mule アプリケーションを作成したら、それを実行してテストします。

  1. Studio で、Mule アプリケーションを保存します。

  2. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)]​ > ​[Run As (別のユーザーとして実行)]​ > ​[Mule Application (Mule アプリケーション)]​ をクリックします。

  3. ブラウザーを開き、​http://0.0.0.0:8081/multitenant​ と入力します。

Mule 4 の動作に関する注意事項 (Mule 3 ユーザー向け):

  • HTTP Listener ソースを通じて投稿された情報は各 FTP サイトに複数回書き込まれますが、Mule 4 の反復可能ストリーム機能によってストリームの複数回のコンシュームによるオーバーヘッドが防止されます。

  • Mule 4 では、For Each コンポーネントは最初に Java 構造に変換することなく、CSV ファイルの各行を自動的に処理します。

    Mule 3 では、最初に CSV ファイルを Java 構造に変換する必要がありました。ただし、Mule 4 は Java に依存しないため、変換せずに動作するようになりました。

ファイルを読み取る場合やリストする場合に、ファイルのメタデータ (たとえば、ファイル名、フルパス、サイズ、タイムスタンプ) を知りたいと考える場合もあります。コネクタは Mule メッセージ属性を使用してこの情報にアクセスします。

FTP サーバーに動的に接続するための XML

この例のフローをすばやく Mule アプリケーションに読み込むには、Studio キャンバスで次のコードを ​[Configuration XML (設定 XML)]​ タブに貼り付けます。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:sftp="http://www.mulesoft.org/schema/mule/sftp"
	xmlns:file="http://www.mulesoft.org/schema/mule/file"
	xmlns:ftp="http://www.mulesoft.org/schema/mule/ftp"
	xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ftp http://www.mulesoft.org/schema/mule/ftp/current/mule-ftp.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.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/sftp http://www.mulesoft.org/schema/mule/sftp/current/mule-sftp.xsd">
	<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<file:config name="File_Config" doc:name="File Config" doc:id="" />
	<ftp:config name="FTP_Config" doc:name="FTP Config" doc:id="" >
		<ftp:connection host="#[payload.host]" username="#[payload.username]" password="#[payload.password]" />
	</ftp:config>
	<flow name="streaming-multitenantFlow" >
<http:listener path="/multitenant"
doc:name="Listener" config-ref="HTTP_Listener_config"/>
<set-variable variableName="content" value="#[payload]" doc:name="Variable" />
<file:read path="recipients.csv" doc:name="Read"
 outputMimeType="application/csv" config-ref="File_Config"/>
  <ee:transform doc:name="Transform Message" doc:id="" >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
payload map using (row = $) {
   host: row.Host,
   user: row.User,
   password: row.Password
}]]></ee:set-payload>
			</ee:message>
		</ee:transform>
		<foreach doc:name="For Each" >
			<ftp:write doc:name="Write" doc:id="" path="recipients.csv" config-ref="FTP_Config"/>
</foreach>
<set-payload doc:name="Set Payload" value="Multicast OK"/>
</flow>
</mule>