1つのシナリオに基づいて使い方とアクションがどのように動作しているか解説します。
下記のようにメールアドレス、氏名が記述されたCSVファイルを読み込み、名前別にメール本文を作成し、メールを送信することを考えます。
MailAddress,FirstName,LastName
yamada.taro@asteria.com,Taro,Yamada
suzuki.hanako@asteria.com,Hanako,Suzuki
CSV読み込み用にCSVReadコンポーネント、メール本文作成用にTemplateコンポーネント、メール送信用にMailSendコンポーネントを配置します。
CSVRead > Template > MailSend
CSVReadコンポーネントはプロパティ出力形式にObjectを選ぶと、CSVの1行目をキーとみなし各行を値としたObjectをPayloadとして次のコンポーネントへ渡します。
上記データの場合はキー以外の行は2行あり、結果的に以下のような2つのObjectを生成します。

{“MailAddress”:“yamada.taro@asteria.com”, “FirstName”:“Taro”, “LastName”:“Yamada”}
{“MailAddress”:“suzuki.hanako@asteria.com”, “FirstName”:“Hanako”, “LastName”:“Suzuki”}
CSVReadは生成された2つのObjectをまとめて次のコンポーネントへPayloadとして渡すのではなく、2回に分けて1つのObjectづつPayloadとして次のコンポーネントへ渡します。
CSVReadコンポーネントはCSVに応じて次のコンポーネントのキューに入れるPayloadを含むコンポーネント変数の回数がかわります。上記例では2回次のコンポーネントのキュへいれます。
言葉を変えると、CSVReadは1回の実行で複数の出力があり、その回数分次のコンポーネントが実行されます。
細かく見ていくと、CSVReadはまず、1つ目のObjectを次のコンポーネントのキュに入れます。次のコンポーネントTemplateは自身のキューにPayloadを含むコンポーネント変数が入れられるまで待っているので入れられた直後に動作を開始します。
{“MailAddress”:“yamada.taro@asteria.com”, “FirstName”:“Taro”, “LastName”:“Yamada”}
Templateコンポーネントは指定されたテンプレートからテキストを生成するコンポーネントです。テンプレート内でプロパティや変数を参照しながら動的なテキストを生成することが可能です。
以下のようなテンプレートを指定しメール本文を作成します。
{{.cv.Payload.LastName}} {{.cv.Payload.FirstName}}様
メール本文
テンプレート内で、CSVReadコンポーネントから渡された氏名を使って動的に生成しています。
Templateコンポーネントは1つの入力から1つの出力を生成するコンポーネントで、生成したテキストをPayloadとして次のMailSendコンポーネントのキューに入れます。
上記例では、以下のようなテキストが入れられたはずです。
Yamada Taro様
メール本文
次のMailSendコンポーネントでも、CSVReadコンポーネントの出力情報が必要なのでTemplateコンポーネントのPostMappingsでPayloadそのものをコンポーネント変数csvに代入します。
PostMappings:
cv.csv = cv.Payload
PostMappingsなので、Templateコンポーネントの入力Payloadを次のコンポーネントのコンポーネント変数csvにPayload(CSVReadコンポーネントの出力のObject)をそのまま代入します。
MailSendコンポーネントは、プロパティToのアドレスに、入力Payloadをメール本文としてメール送信するコンポーネントです。
入力Payloadは前のTemplateコンポーネントで作成されたテキストをそのまま使います。
プロパティToには送信先アドレスを指定するため、PreMappingsで前のコンポーネントでコンポーネント変数csvからMailAddressを代入する。また件名(Subject)もコンポーネント変数から動的な件名を生成し代入する。
PreMappings:
cp.To = cv.csv.MailAddress
cp.Subject = cv.csv.LastName + “ “ + cv.csv.FirstName + “様へ新製品のご案内”
PreMappingsの処理が終わるとMailSendコンポーネントはメールを送信します。
CSVから生成した動的な本文、件名、送信先でメールが送信されることが確認できると思います。
次にCSVの2つ目のデータが処理されはじめますが、じつは既に2つ目のデータはここにくる以前から処理がはじまっています。具体的にはCSVReadコンポーネントが1つ目のデータをPayloadとしてTemplateコンポーネントのキューにいれて、Templateコンポーネントが処理をはじめた時に、並列にCSVReadコンポーネントは2つ目のデータ処理を引き続き行っていました。
Templateコンポーネントが1つ目のPayloadを処理してMailSendコンポーネントのキューにテキストを入れた時に、2つ目のPayloadがキューに届いていたらMailSendコンポーネントがメール送信中(ネットワークI/O待ち)にテキスト生成を並列に行っていたはずです。
このように各コンポーネントは独立したコンテキスト、スレッドで並列に処理され、あるコンポーネントがI/O待ちになっている間も処理を続けられるので全体として効率よく処理されるようになっています。
結果的にCSVReadは1回の実行で2つのPayloadを生成して、TemplateとMailSendコンポーネントは2回実行されます。
01:46
TemplateコンポーネントからMailSendコンポーネントへCSVの情報を受け渡す時にコンポーネント変数cvではなく、仮にアクション変数avを使うと、MailSendコンポーネントのPreMappingsが処理される前に上書きされてしまう可能性があり意図した動作にならないことがあることがわかると思います。
今回は意図的にcv.csvを使いMailSendコンポーネントにCSVのデータを渡しましたが、今回の例ではTemplateコンポーネントのPostMappingsで直接、次のコンポーネントのプロパティに代入することもできるので、それを使うのが効率がいいかもしれません。
CSVReadコンポーネントのように、複数のPayloadを生成するコンポーネントは以下のものがあります。
Split (配列や文字列を分割し、各々別Payloadとして次のコンポーネントに渡す)
FileList (ワイルドカードなどのパターンを指定しファイル一覧を取得し、ファイル名1つづつがPayloadとして次のコンポーネントに渡す)
SensorDataDB (マッチしたレコードが1つづつPayloadとして次のコンポーネントに渡す)
逆に入力より、出力が減るコンポーネントとして以下のものがあります。
Join (複数のPayloadを配列にまとめて出力する)
Filter (条件を指定し、条件にマッチした時、そのPayloadを次のコンポーネントへ渡す)
また、CSVReadやFileList、SensorDataDBなどはレコードが1つもなければ次のコンポーネントへなにも渡さず、結果的に次のコンポーネントが1度も実行されず、アクション全体が終了する可能性もあります。Filterも1つも通過させなければ同様になります。

Feedback

Was this helpful?

Yes No
You indicated this topic was not helpful to you ...
Could you please leave a comment telling us why? Thank you!
Thanks for your feedback.

Post your comment on this topic.

Post Comment