Apexバッチの1分毎実行

in #side7apex4 years ago

リアルタイム性が必要な時は非同期でやるが
諸事情でバッチでやる必要がある場合
分の後半にジョブ登録すると実行されない場合があるので
その対応が必要

ジョブ登録~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 ); //登録
}

Coin Marketplace

STEEM 0.17
TRX 0.25
JST 0.034
BTC 96277.96
ETH 2823.68
SBD 0.68