Salesforceで決まった時間に自動的にバッチを実行させる


1.実際の処理をするファイルを作成
2.スケジューラとして起動させるためのファイルを作成
3.スケジュールを登録する
4.祈る

番外編
登録したスケジュールを削除・解除する方法

1.実際の処理をするファイルを作成
 1.1:ファイルを作る
 1.2:テスト実行する
1.1ファイルを作る
Database.Batchableを継承したクラスを作る必要があります
Database.Statefulをつけておくとメンバ変数のパラメータが維持される?みたいなのでつけておくと便利かも

インターフェースの方は見てないのでわからないけど、実装が必要な関数は3つ
start:開始前に呼ばれる
execute:処理を行う
finish:終了処理を行う

中で勝手にできるならコンストラクタのSQOLいる?という気がしないでもない。
ロジックが同じで扱うデータが変わるのならまぁなるほどという感じ

global with sharing class testBatch implements Database.Batchable, Database.Stateful {
private String query;
private Boolean m_bCheck;

//コンストラクタ
global testBatch(String q){
System.debug(‘constructor’);
query = q;
m_bCheck = false;
}

//バッチ開始処理
//開始するためにqueryを実行する。この実行されたSOQLのデータ分処理する。
//5千万件以上のレコードになるとエラーになる。
global Database.QueryLocator start(Database.BatchableContext BC){
return Database.getQueryLocator(query);
}

//バッチ処理内容
//scopeにgetQueryLocatorの内容がバッチサイズ分格納されてくる
global void execute(Database.BatchableContext BC, List scope){
// 処理内容
// 繰り返しされたくないので、初回のみ通すためにフラグを持たせる
if( m_bCheck == true ){
return;
}
// 一度通ったら通さないためにフラグを上げる
m_bCheck = true;

// データがインサートされたかどうかでバッチ処理が通ったかを占う
List objList = new List();
for(Integer i=0; i< 1; i++){
Account obj = new Account();
// 適当名前や繰り返し入れれる名前がいいと思います
obj.Name = ‘テストインサート2′;
objList.add(obj);
}
insert objList;
}

//バッチ完了処理
global void finish(Database.BatchableContext BC){
//処理内容
System.debug(‘batch finish’);
}
}

1.2動作チェックを行う
開発者コンソールで以下を実行
testBatch b = new testBatch(‘SELECT Name FROM Account’);
Database.executeBatch(b,200);

これで実行できます・・・・がstartやexecuteにSystem.debugなどでログを仕込んでも出ません!
なんとなくの予想ですが、バッチが別スレッドに行っちゃって、コンソールのログとして表示されないのかな?と思います。
なので、テスト用のプログラムでも、値を変化させるかデータを作るかなど、何かしらの観測できる処理を入れないと
手ごたえがありませんのでご注意ください。

2.スケジューラとして起動させるためのファイルを作成

クーロンのファイルに書き込む、というのとはまた違った感じで、バッチ処理を動かすためのスクリプトが別途必要になります

まぁこっちは単純な話で Schedulableを継承したクラスのexecute関数に処理を書くだけです。
さっき作ったクラスを呼び出すのはこげな感じ。
第2引数の200は一回の実行で処理するデータの個数になります。(デフォルト引数も200だったような)

global class testBatchSchedule implements Schedulable {
global void execute(SchedulableContext ctx) {
// awesome code here
testBatch b = new testBatch(‘SELECT Name FROM Account’);
Database.executeBatch(b,200);
}
}

※すでにこのスケジュールが登録されている場合、編集保存ができません。保存で怒られても焦らないようにしてください
(この手順ではまだ登録してないでしょうが、編集する時に知ってないと焦りますんでね。ロス10分)

3.スケジュールを登録する
2通りあります。
3.1簡単設定
設定>開発>Apexクラス
 →Apex をスケジュール
あとはお好みの設定をしてうまいこと登録してください。
ちなみにこの方法だと1時間おきにしか設定できません。もっと分けたりしたい場合は次の方法で設定してください

3.2詳細設定
クーロンとかで設定するよくある方法でももちろん登録できます
開発者コンソール上で下記コマンドを入力すると毎時55分にバッチが実行されます
System.schedule(‘ジョブ名’,’0 55 * * * ?’, new testBatchSchedul());

順番は左側から
秒、分、時、日、月、曜日、年
の順番になっており、*はワイルドカードとして利用できます
ジョブ名は設定>ジョブ>スケジュール済みジョブ で確認するときのラベル的な扱いなので、意味の伝わりやすいものが望ましいです

4.祈る
時間が来ると実行されること祈ってください。
うまくできてなかった場合はバッチの中身なのか、スケジュールなのか、登録方法なのか、3つ原因があるので、
頑張ってあたりをつけてください

おまけ
登録したの消したいんだけど!という場合。
上記に記した、スケジュールを確認するページ( 設定>ジョブ>スケジュール済みジョブ )のページにて
現在登録されているスケジュールが確認できます。
見たことないのもプリセットされてるみたいなので気になるようでしたら確認してみてください。
ここで自分でつけたジョブ名を確認して、不要なものを消してください。
スケジュールのスクリプトを変更する場合は一度削除しないと編集できないので、ご利用くださいませ


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">