はじめに
Salesforeのスケジュールフローで設定できる頻度は現在
- 特定の日時に1回
特定の時間に
- 毎日
- 毎週
実行ができるのみとなっています。
これを、1日に数回起動したいとなると解決策としてはApexスケジューラーでの実装になるかとおもいます。
今回は、Apexスケジューラーでフローを起動してみます。
フローをやめて
Database.Batchable のApex一括処理バッチ + Apexスケジューラーで実装でもいいかもですが、
今回は、Apexとフローを作成する人が別の場合に使えるかもな?と思い記事を書いています。
今回やること
Apexスケジューラーで、Flow.Interview
でフローを起動し成功することを確認すること
実行用のフローを作成
Apexからの呼び出しになるので、自動起動フローを作成します。
作成するフローは、取引先レコードを作成するものです。
Apexの作成
/* flowを定期実行するクラス
* 開発者コンソールから以下のように設定する
* Map<String, Object> inputs = new Map<String, Object>();
* BatchFlowInterviewAction batch = new BatchFlowInterviewAction('flowTest', inputs);
* System.schedule('毎時0分に実行 取引先作成','0 0 * * * ?', batch);
*/
public with sharing class BatchFlowInterviewAction implements Schedulable {
public String flowName;
public Map<String, Object> inputs;
public BatchFlowInterviewAction(String flowName, Map<String, Object> inputs) {
this.flowName = flowName;
this.inputs = inputs;
}
public void execute(SchedulableContext ctx) {
Flow.Interview flow = Flow.Interview.createInterview(
this.flowName,
this.inputs
);
flow.start();
}
}
実行の仕方はこんな感じ
Map<String, Object> inputs = new Map<String, Object>();
BatchFlowInterviewAction batch = new BatchFlowInterviewAction('flowTest', inputs);
System.schedule('毎時0分に実行 取引先作成','0 0 * * * ?', batch);
createInterview(flowName, inputVariables)
自動起動フローのAPI参照名をflowName
に渡す。
今回は利用していないが、inputVariables
に値を渡すことでフローの入力可能な変数に値をセットすることもできる
public void execute(SchedulableContext ctx) {
+ Flow.Interview flow = Flow.Interview.createInterview(
+ this.flowName,
+ this.inputs
+ );
+ flow.start();
}
開発者コンソールで登録
Apexスケジューラーを登録する方法は、開発者コンソールやsfdx等あるが今回は
開発者コンソールを使う
設定>開発者コンソール
を起動
Debug>Open Execute Anonymous Window
を開く
以下のコードを貼り付けて実行
Map<String, Object> inputs = new Map<String, Object>();
BatchFlowInterviewAction batch = new BatchFlowInterviewAction('flowTest', inputs);
System.schedule('毎時0分に実行 取引先作成','0 0 * * * ?', batch);
実行確認
スケジュールが登録されているか確認
設定>スケジュール済みジョブ
から確認できます。
結果
データが生成されていました。
設定>Apexジョブ
Apexジョブで状況がキューのままになる??
仕様により、スケジュール済みの Apex ジョブは、ジョブの次回実行分がなくなるまで、常に [Queued] ステータスのままになります。次に、完了とマークされます。
とのことのなので
成功したか?失敗したか?どちらも知りたい場合は、ログ用のカスタムオブジェクトに入れる等必要そうだ。
スケジュール削除
設定>スケジュール済みジョブ
で該当のジョブを削除
さいごに
Apexスケジューラーを使って自動起動フローを1日に何回も起動することができました。
Apexジョブが新規で作られる訳ではなく、キュー→完了→キュー となるのは少し気持ち悪いですが
ログ系のオブジェクトに入れるとかエラーになったらメール通知する等で対応しようねてことでしょう。
今回はApexスケジューラーでしたが、Flow.Interview
でフローを実行できることがわかったので
フロー自体のテストをFlow.Interview
で書くのありですね。
フローにもテストを作る機能はありますが、全部補えるわけではないのでApexでテスト書くのありな気がしました。
参考にさせたいただいた記事