フローの作成と制御
Q1異なるユーザーのフローを実行したい場合はどうすればいいですか?
A
異なるユーザーの所有するフローの起動は、FlowInvokerコンポーネントを使用することで実現できます。
使用例
- USER1(異なるユーザー)でメイン処理のフローを作成する
- USER2(自ユーザー)のフローの中でUSER1が作成したメイン処理フローを呼び出す
USER1 - フロー作成ユーザー
- フロー:
ownertest.Flow1 - フローのプロパティ設定
- 実行を許可するユーザ:
USER2
- 実行を許可するユーザ:
USER2 - フロー実行ユーザー
- フロー:
usertest.Flow1 Start→FlowInvoker→End※シンプルなフロー構成にします- FlowInvokerコンポーネント設定
- 実行するフロー:
ownertest.Flow1 - 実行するフローのオーナー:
USER1
- 実行するフロー:
詳細については、FlowInvokerコンポーネントヘルプをご参照ください。
📝 NOTE
FlowInvokerコンポーネントは、ASTERIA Warp Core/Core+/Core++ エディションではお使いいただけません。
Q2同じフローを多重起動しないようにするにはどうすればいいですか?
A
同じフローを多重起動しないようにするには、フローの最初にMutexコンポーネントを配置して以下のプロパティを設定します。これにより、すでに同じフローが実行中であればロックが解除されるまで実行を待つようにすることができます。
| プロパティ名 | 値 |
|---|---|
| ID | (指定しない) |
| ロックされていたらエラーにする | いいえ |
| タイムアウト(秒) | 0 |
| ロック処理 | ロック |
後から起動したフローを実行しないようにするには、「ロックされていたらエラーにする」プロパティを「はい」にします。 詳しくはMutexコンポーネントのヘルプを参照してください。
📝 NOTE
Mutexコンポーネントは、ASTERIA Warp Core エディションではお使いいただけません。
Q3ループ内で実行されるサブフローでフロー変数の初期値が使用されないことがあります
A
フローがサブフローとして実行される場合、そのサブフローコンポーネントごとにフロー変数の領域が確保されます。この領域はループ内で呼び出された場合は初回呼出し時にのみ初期化されますので、このタイミングでフロー変数の初期値が設定されます。
2回目以降の実行では初期化されないので、フロー変数の初期値は設定されません。初回のサブフロー内の処理でフロー変数を初期値から変更した場合、2回目のサブフロー実行時には変更した値が引き継がれます。
ループの各実行時にフロー変数を初期化したい場合は、呼び出されるフローの中でマッピングを使うなどして値を初期化する必要があります。
例1
MainFlow : Start → LoopStart → SubFlow1(Flow1を呼び出し) → End
- SubFlow1の初回実行時(*1)はFlow1のフロー変数には初期値が設定されます。
- SubFlow1の2回目以降の実行時(*2)はFlow1のフロー変数には初期値が設定されません。
- *1でFlow1のフロー変数を変更した場合、*2ではその値が引き継がれます。
なお、同じフローを別々のサブフローコンポーネントから呼び出す場合は、それぞれのサブフローコンポーネント単位にフロー変数の領域を持ちますので、それぞれの初回実行時にフロー変数に初期値が設定されます。
例2
MainFlow : Start → LoopStart → SubFlow1(Flow1を呼び出し) → SubFlow2(Flow1を呼び出し) → End
- SubFlow1の初回実行時(*1)はFlow1のフロー変数には初期値が設定されます。
- SubFlow2の初回実行時(*2)はFlow1のフロー変数には初期値が設定されます。
- *1でFlow1のフロー変数を変更した場合でも*2ではその値が引き継がれません。
- SubFlow1の2回目以降の実行時(*3)はFlow1のフロー変数には初期値が設定されません。
- *1でFlow1のフロー変数を変更した場合、*3ではその値が引き継がれます。
- *2でFlow1のフロー変数を変更した場合でも*3ではその値が引き継がれません。
- つまり、*1と*2でフロー変数を変更した場合、*3では*1で設定した値が引き継がれます。
- SubFlow2の2回目以降の実行時(*4)はFlow1のフロー変数には初期値が設定されません。
- *2でFlow1のフロー変数を変更した場合、*4ではその値が引き継がれます。
- *3でFlow1のフロー変数を変更した場合でも*4ではその値が引き継がれません。
- つまり、*2と*3でフロー変数を変更した場合、*4では*2で設定した値が引き継がれます。
Q4サブフローの処理が終わるのを待たずに次の処理に進むことはできますか?
A
呼出し元フローでは必ずサブフローの処理が終わってから次の処理を行います。
代わりにTimerコンポーネントを利用することで、別のフローの呼び出しだけを行って後続の処理を続行することができます。ただし、呼び出し方や渡せるデータ、セッションなどの扱いがサブフローコンポーネントとTimerコンポーネントでは異なりますので注意してください。
詳しくはTimerコンポーネントのヘルプを参照してください。
📝 NOTE
Timerコンポーネントは、ASTERIA Warp Core/Core+/Core++ エディションではお使いいただけません。
Q5サブフローにデータを渡すにはどうすればいいですか?
A
サブフローにデータを渡すにはいくつかの方法があります。それぞれメリットデメリットがありますので、使い方によって適切な方法をとってください。サブフローについて詳しくは「フローサービスマニュアル」の「はじめに」-「詳細なトピック」-「フロー内の処理の流れ」-「サブフロー」を参照してください。
サブフローのフロー変数を利用
サブフローでフロー変数を定義して「公開」プロパティをチェックすると、呼び出し側のサブフローコンポーネントのインスペクタで「パラメータ」プロパティとして見えるようになります。
ストリームを利用
サブフローコンポーネントへの入力ストリームはサブフローのStartコンポーネントのストリームとして受け渡します。
外部変数を利用
呼び出し側のフローとサブフローの両方で同じ外部変数セットを使用することで両方から参照することができます。
Q6プロジェクト、フロー、コンポーネントの数に上限はありますか?
A
プロジェクト数、フロー数、および1つのフローに配置できるコンポーネント数のいずれにも明確な上限はありません。ただし、サーバーやフローデザイナーの動作環境に依存して動作が遅くなることがあるため、規模が大きくなる場合は以下の点に注意してください。
作成できるプロジェクト数
作成できるプロジェクト数の上限はありませんが、サーバーで使用できるメモリ容量やフローデザイナーを起動しているクライアントのスペックにより動作が遅くなることがあります。
また、キャッシュできるプロジェクト数には上限がありますので、多くのプロジェクトが常に使用されている状態では頻繁にキャッシュアウトが起きてしまうことがあります。このような場合は、フローサービス管理コンソールでプロジェクトキャッシュサイズを拡張することができます。詳しくは「フローサービス管理コンソールオンラインヘルプ」の「設定」-「サービス」-「フロー」の「フローエンジン設定」を参照してください。
1つのプロジェクト内に作成できるフロー数
1つのプロジェクト内に作成できるフロー数の上限はありません。
ただし、ひとつのプロジェクトファイルのサイズが大きくなるとコンパイルにかかる時間が長くなりますので、適度にプロジェクトを分割することをおすすめします。
1つのフローに配置できるコンポーネント数
配置できるコンポーネント数の上限はありませんが、サーバーで使用できるメモリ容量やフローデザイナーを起動しているクライアントのスペックにより動作が遅くなることがあります。
Q7プロパティ式でRQL表記を使えますか?
A
コンポーネントのプロパティに指定するプロパティ式で使える項目は
- フロー変数
- 外部変数セット
- システム変数
- ストリーム変数
- 直前のコンポーネントのプロパティ
- 現在日時
- UUID
です。
RQLを使って「$record.<フィールド名>」のように直前のレコードの値を参照することはできません。
Q8BranchByExceptionコンポーネントに指定した正規表現で分岐しません
A
BranchByException、BranchByComponentProperty、SwitchRegexpコンポーネントの「正規表現」プロパティで、ある文字列を含むときに分岐したい場合には、ある文字列のみを指定するのではなく文字列全体にマッチする正規表現を指定する必要があります。
例えば、BranchByExceptionで「分岐条件」プロパティを「エラー情報」にして「Error:XXXX」のように「Error:」の後に任意の文字列がついたエラー情報にマッチさせるには、「正規表現」プロパティに「Error:」と文字列の一部を指定するのではなく「Error:.*」のようにエラー情報全体にマッチする正規表現を指定します。(ドットが任意の1文字、アスタリスクが0回以上の繰り返し、という意味で合わせて任意の文字が0文字以上あるという意味になります。)
📝 NOTE
BranchByExceptionコンポーネント・BranchByComponentPropertyコンポーネント・SwitchRegexpコンポーネントは、ASTERIA Warp Core エディションではお使いいただけません。
Q9BranchStartコンポーネントで「条件式が不正です」というエラーになります
A
BranchStartコンポーネントの「条件式」プロパティに「$flow.var1 = $record.field1」のような内容を記述したとき次のようなエラーになります。
FLCP_E_2035: プロパティ値が不正です :[Property=Condition][条件式が不正です : $flow.var1 = record.field1]
RQLでレコードに対して条件を記述する場合、条件式の右辺に「$record」でレコードのフィールドを指定することはできません。 「$record.field1 = $flow.var1」のように左辺に記述してください。
BranchStartのRQLによる条件式については、コンポーネントヘルプの「条件式について」の「RQL」を参照してください。
Q10フローで条件によって3分岐以上処理を分けるにはどのコンポーネントを使えばよいですか?
A
3つ以上の分岐の場合、次のように複数のBranchStartコンポーネントを使って分岐します。
BranchStart(条件1) → 条件1の場合
BranchStart(条件2) → 条件2の場合
BranchStart(条件3) → 条件3の場合
また、あらかじめ条件によってインデックスとなる整数値を割り当てておいて、Choiceコンポーネントを使って分岐する方法もあります。
Choiceコンポーネントでは「分岐数」プロパティに分岐する数(例えば3)を指定し、直前のMapperコンポーネントでChoiceコンポーネントの「インデックス」プロパティに分岐先のインデックスを設定することで次のように分岐します。
- 1の場合:一番左の出力コネクタ
- 2の場合:左から2番目の出力コネクタ
- 3の場合:左から3番目の出力コネクタ
詳しくはそれぞれBranchStartコンポーネント、Choiceコンポーネントのヘルプを参照してください。
📝 NOTE
Choiceコンポーネントは、ASTERIA Warp Core エディションではお使いいただけません。
Q11条件付きレイヤーが複数ある場合はどの順に評価、実行されますか?
A
マッパーに条件付きレイヤーが複数ある場合、レイヤータブの左から順に評価され、条件に合致すればそのレイヤーが実行されます。
Q12条件なしレイヤーが複数ある場合はどのような順番で実行されますか?
A
マッパーに条件なしレイヤーが複数ある場合、これらは1つのレイヤーとして扱われます。その中のマッピングは順不同で処理されます。
Q13BranchStartコンポーネントで「$flow.var1 = true」と記述しても正しく分岐しません
A
BranchStartコンポーネントの入力ストリームがXMLの場合、上記のような変数を比較するときも明示的にRQLであることを示すためのプレフィックス「record:」が必要です。正しくは、「record:$flow.var1 = true」と記述します。
BranchStartコンポーネントのヘルプで「XPath」-「bool値との比較」を参考にしてください。
Q14コンポーネントにてエラーが発生した時、エラー処理の動作について教えてください
A
以下の通り動作します。
- 特定エラーが発生した場合
- コンポーネントの特定エラー処理プロパティが「(なし)」以外の場合:コンポーネントの特定エラー処理で設定した内容でエラー処理が行われます。
- コンポーネントの特定エラー処理プロパティが「(なし)」の場合:コンポーネントの汎用エラー処理 → フローの汎用エラー処理順でエラー処理が行われます。
- 汎用エラーが発生した場合
- コンポーネントの汎用エラー処理プロパティが「(なし)」以外の場合:コンポーネントの汎用エラー処理で設定した内容でエラー処理が行われます。
- コンポーネントの汎用エラー処理プロパティが「(なし)」の場合:フローの汎用エラー処理が行われます。
例えば、FileGetコンポーネントでエラーが発生した場合、エラー処理プロパティの設定によって以下の通り処理されます。
特定エラー(ファイルが存在しない)が発生した場合
| コンポーネントのプロパティ設定 特定エラー |
コンポーネントのプロパティ設定 汎用エラー |
フローのプロパティ設定 汎用エラー |
エラー処理の動作 |
|---|---|---|---|
| (なし) | (なし) | (なし) | フローが異常終了となります。 |
| (なし) | (なし) | (なし)以外 | フローの汎用エラー処理が実行されます。 |
| (なし) | (なし)以外 | (なし)以外 | コンポーネントの汎用エラー処理が実行されます。 |
| (なし)以外 | (なし)以外 | (なし)以外 | コンポーネントの特定エラー処理が実行されます。 |
汎用エラーが発生した場合
| コンポーネントのプロパティ設定 特定エラー |
コンポーネントのプロパティ設定 汎用エラー |
フローのプロパティ設定 汎用エラー |
エラー処理の動作 |
|---|---|---|---|
| (なし) | (なし) | (なし) | フローが異常終了となります。 |
| (なし) | (なし) | (なし)以外 | フローの汎用エラー処理が実行されます。 |
| (なし) | (なし)以外 | (なし)以外 | コンポーネントの汎用エラー処理が実行されます。 |
| (なし)以外 | (なし)以外 | (なし)以外 | コンポーネントの汎用エラー処理が実行されます。 |
Q15条件式の設定で右辺にRecord形式のフィールドが設定できますか
A
できません。 BranchStartコンポーネントやマッパーに設定する条件式の右辺には「文字列」、「数値」、「bool値(true/false)」、「変数」のいずれかが指定できます。
Q16ExceptionReturnコンポーネントの「トランザクション」を「ロールバック」にしてもロールバックされない
A
ExceptionReturnコンポーネントは基本的にエラー発生元に戻って処理を継続するためのコンポーネントです。 処理が継続しますのでトランザクションは戻ったフローの最後のEnd系コンポーネントの「トランザクション」の指定(コミット/ロールバック)に従います。 この時ExceptionReturnコンポーネントでの「トランザクション」の指定は無視されます。
ExceptionReturnコンポーネントで指定した「トランザクション」の指定(コミット/ロールバック)が有効になるのはエラー発生元ですぐに終了する下記条件に適合する場合のみです。
- エラー発生元:トランザクションとしての最上位フロー(かつLoopEndによるループ内でない)
- ExceptionReturnコンポーネントの「エラー処理後の動作」が「フローの終了」
戻る必要がないのであれば、エラー処理の最後はExceptionReturnコンポーネントではなく、通常のEnd系コンポーネントを使用してください。
Q17LoopEndのループ開始コンポーネントにRecordJoinを指定するとコンパイルエラーになります
A
LoopEndの「ループ開始コンポーネント」プロパティにはRecordJoinのように入力ストリームが複数存在するコンポーネントを指定することはできません。 RecordLoopコンポーネントなどを後続に配置してLoopEndの「ループ開始コンポーネント」に指定してください。
Q18RecordLoopやRDBGetで入力レコードが0件の場合も1回はループ処理が実行されます
A
RecordLoopやRDBGetなどで「ループを開始」に「はい」を指定していると、入力のレコード件数が0件の場合も1回はループ処理が行われます。
Q19Mutexコンポーネントではどのような順番で次のロックが獲得されるのですか?
A
次にロックを獲得するフローはロックを作成するMutexコンポーネントが実行されて待機になった順になります。
バージョン4.8.1以前では、次にロックを獲得するフローは必ずしもロックを作成しようとして待機した順とはならず、不定となります。
📝 NOTE
Mutexコンポーネントは、ASTERIA Warp Core エディションではお使いいただけません。
Q20サブフロー内で行ったMutexロックが解除されるタイミングを教えてください
A
メインフローの一部であるサブフロー内でMutexコンポーネントを使ってロックした場合、サブフローの終了時にはロック解除されません。Mutexコンポーネントを使って明示的にアンロックしない限り、メインフローが終了するまでロックされたままになります。
Q21Timerコンポーネントで実行したフローが呼出し元のフローの終了より先に開始されてしまいます
A
フローAからフローBを呼び出す場合にTimerコンポーネントを使用すると、フローAが終了する前にフローBが開始することがあります。これはTimerコンポーネントがフローAの実行とは別スレッドでフローBを開始するためです。つまり、フローAとフローBは並列に実行されることになります。
フローを順番に実行したいとき、たとえばフローAが確実に終了してから次にフローBを実行したいようなときには、フローAの終了コンポーネントにNextFlowコンポーネントを使用してください。
また、SingleScheduleコンポーネントを使って実行日時を指定して実行した場合も同様です。SingleScheduleコンポーネントはフローBの実行をスケジューラーに登録するとすぐに処理制御が戻ってきます。
スケジューラーではスケジュールされた時刻がくるとフローAの実行とは関係なくフローBを開始します。このため、タイミングによってはフローAよりもスケジュールしたフローBが先に開始することがあります。
📝 NOTE
NextFlowコンポーネント・SingleScheduleコンポーネントは、ASTERIA Warp Core/Core+/Core++ エディションではお使いいただけません。
Q22外部変数セットの内容を変更したらフローがエラーになってしまいました
A
外部変数セット名などを変更した場合、その外部変数セットを参照しているフローなどがあるとそのままでは変更が反映されずに実行エラーになります。
これらの変更を反映させるには、「外部変数セットの編集」ダイアログボックスの「参照確認」ボタンをクリックするか、外部変数セットを右クリックして表示されるメニューの「変数参照の検索」をクリックするなどして、参照先のプロジェクトを更新してください。
詳しくは「フローサービスマニュアル」の「フローデザイナー」-「外部変数セット」-「編集した内容を参照元に反映する」を参照してください。
Q23外部変数セットファイルを移動するとアクセスできなくなります
A
フロー中で使用している外部変数ファイルのファイルパスは下記の条件の場合、相対パスで格納されます。
- プロジェクトファイルと同じフォルダかその下位階層のフォルダにある場合
上記に該当しない階層のフォルダに移動などを行うと、外部変数ファイルにアクセスできなくなります。
対応としましては、ファイルパスは編集できないためフロー上で外部変数ファイルを一旦削除して再配置してください。
外部変数を使用している箇所に影響(マッピングのリンク切れなど)が出る場合がありますので、フロー中で外部変数を使用している箇所の確認や動作検証を行い、問題がある場合は修正を行ってください。
Q24EXEコンポーネントの「リターンコード」プロパティには何が設定されますか?
A
EXEコンポーネントの「リターンコード」プロパティには実行したプログラムやコマンドの終了コードが設定されます。 具体的な値に関しては実行するプログラムやコマンドのドキュメントやヘルプを参照してください。
Q25EXEコンポーネントで別マシン上の実行ファイルやスクリプトを実行することはできますか?
A
できません。
EXEコンポーネントは、ASTERIA Warpがインストールされているマシン上の外部プログラムを実行するコンポーネントです。
📝 NOTE
EXEコンポーネントは、ASTERIA Warp Core/Core+/Core++ エディションではお使いいただけません。
Q26EXEコンポーネントでコマンド実行がエラーになります
A
EXEコンポーネントでコマンドやバッチファイル実行するときにコマンドや引数に空白文字を含む場合に実行エラーになることがあります。 このような場合は、プロパティに記述するコマンドや引数を「"」で囲んでひとつにまとめるようにしてください。
例)cmd.exe /c "@echo test > test.txt"
Q27Windowsサービス起動でEXEコンポーネントで実行した外部プログラムが動作しません
A
Windowsサービスで起動したフローサービスでEXEコンポーネントにより外部プログラムを実行した際、エラーが発生したり、反応がない場合があります。
よく発生する事例としては下記が報告されています。
- Excelのモジュールを使用するvbsの実行
- PsExec.exeの実行
このような場合、下記の方法で改善できるかご確認ください。
-
Windowsサービスのプロパティ設定でログオンアカウントを変更する
📝 NOTE
デフォルトでは「ローカルシステムアカウント」となっており、Windowsにログインしているアカウントと異なるアカウントでフローサービスを起動するのが影響する可能性があります。 WindowsサービスのログオンアカウントをWindowsにログインしたアカウントと合わせ、動作をご確認ください。 -
Windowsサービスのプロパティ設定で「デスクトップとの対話をサービスに許可」にチェック
📝 NOTE
Windowsサービス起動を行った場合には対話モードを使用することができません。 サービスの設定項目「デスクトップとの対話をサービスに許可」にチェックを入れることで、現象が解消されるかご確認ください。
上記をお試し頂き、現象が解消されない場合には該当の外部プログラムはサービス起動では使用できない可能性があります。 フローサービスをスタートメニューから起動する方法をご検討ください。
Q28エラー処理でログにエラーメッセージを出力しないようにしているのに出力されてしまいます
A
ASTERIA Warpでは、LoopEndコンポーネントなどによりループ処理の終了位置がフローの途中に指定されている場合にフローの一部が内部的にサブフローとして処理される場合があります。これを「インラインサブフロー」と呼びます。 このインラインサブフロー内でエラーが発生した場合、フローの設定でログ設定が行われていてもERRORレベルでログが出力されます。 インラインサブフローでのログ出力レベルを変更することはできません。
Q29「パックするストリームのストリーム型が異なります」というエラーが発生します
A
LoopEndコンポーネントなどストリームをパックするコンポーネントに異なるストリーム型のストリームが複数回セットされたときに出力されるメッセージです。 「出力形態」プロパティを[ストリームをまとめる]に設定していて異なるストリーム型のストリームがセットされていないか確認してください。
