Apexバッチの1分毎実行
リアルタイム性が必要な時は非同期でやるが
諸事情でバッチでやる必要がある場合
分の後半にジョブ登録すると実行されない場合があるので
その対応が必要
⇒
ジョブ登録~SalesforceのCron登録処理~ジョブ実行
⇒
Cron登録のはざまに入るとジョブがゴミ化すると思われる
※
あと、Salesforceメンテのタイミングジョブが消えるので
監視バッチは必要
たぶん
1.バッチ実行
2.メンテはいる
3.バッチは引き続き実行で終了時に次回登録
4.登録できてない(削除はできてる)
5.メンテ終わる
6.消えてる
になるのだと思う
private static void createJob(Schedulable argSchedule, String argJobName) {
//スケジュール削除
List<CronTrigger> ct = [ SELECT Id, CreatedDate FROM CronTrigger WHERE CronJobDetail.JobType = '7' and CronJobDetail.Name LIKE :argJobName + '%'];
if(ct != null && ct.size() > 0){
Datetime delBaseTime = System.now().addMinutes(-1 * 1 * 30);//過去ジョブの削除 1分インターバルとして30分より古ければ削除
for(CronTrigger c : ct) {
if(c.CreatedDate < delBaseTime) System.abortJob( c.Id );
}
}
//次回実行時間を取得
Datetime executeNext = System.now().addMinutes(1);
//次回実行まで30秒を切っている場合は次回実行時間をのばす⇒ジョブは分単位なので秒が30超えていたら延長
if(30 < executeNext.second()) {
executeNext = executeNext.addMinutes(2);
}
//次回スケジュール
String yyyymmddmm = executeNext.format('yyyyMMddHHmm');
String jobName1 = argJobName + yyyymmddmm; //ジョブ名+YYYYMMDDmm
String year = String.valueOf(executeNext.year());
String month = String.valueOf(executeNext.month());
String day = String.valueOf(executeNext.day());
String hour = String.valueOf(executeNext.hour());
String minute = String.valueOf(executeNext.minute());
String scheduleAt = '0 ' + minute + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year;
//スケジュール登録
System.schedule( jobName1 , scheduleAt , argSchedule ); //登録
}