LoginSignup
23
16

More than 3 years have passed since last update.

非同期Apexの概要

Last updated at Posted at 2019-06-21

1.非同期Apexの種類

image.png

2.1.@futureメソッド

一般的なシナリオ

image.png

構文

public class SMSUtils {
    @future(callout=true)
    public static void sendSMSAsync(String fromNbr, String toNbr, String m) {
        String results = sendSMS(fromNbr, toNbr, m);
        System.debug(results);
    }

    public static String sendSMS(String fromNbr, String toNbr, String m) {
        String results = SmsMessage.send(fromNbr, toNbr, m);
        insert new SMS_Log__c(to__c=toNbr, from__c=fromNbr, msg__c=results);
        return results;
    }
}

留意事项

  • static void である必要あり。
  • 引数はプリミティブ型、プリミティブ型の配列、プリミティブ型のコレクション

  ※sObjectが渡せない理由
   メソッドをコールしてからそのメソッドを実際に実行するまでの間にオブジェクトが変更される可能性があるためです。

  • future メソッドから future メソッドをコールすることはできません。
  • future メソッドはコールされた順序で実行されるとは限りません。

2.2.Queueableインターフェース

一般的なシナリオ

image.png

構文

public class XXQueueable implements Queueable {
    public XXQueueable(List<Account> records, ID id) {
        // 初期化処理
    }
    public void execute(QueueableContext context) {
        // 業務処理
    }
}

留意事项

  • 1トランザクションでSystem.enqueueJobを使用してキューに追加できる最大数は50。
    image.png

  • 実行中のジョブからSystem.enqueueJobで追加できるジョブは1つのみ。
     ※親キュー可能ジョブごとに1つの子ジョブしか存在できない。
    image.png

  • Dev環境でのチェーニング最大スタック深度は5までなので注意。

2.3.Schedulableインターフェース

一般的なシナリオ

image.png

構文


global class XXSchedulable implements Schedulable {
    global void execute(SchedulableContext ctx) {
        // 業務処理
    }
}

スケジュール登録方法

image.png

2.4.Database.Batchableインターフェース

一般的なシナリオ

image.png

構文

global class XXBatchable implements Database.Batchable<sObject> {
    // バッチの処理対象データ(1回のみ実行)
    global Database.QueryLocator start(Database.BatchableContext bc) {
        String strQuery = 'SELECT id, Name・・・FROM XX__c WHERE・・・';
        Database.getQueryLocator(strQuery);
    }

    // バッチサイズごとに実行する(複数回実行)
    global void execute(Database.BatchableContext bc, List<sObject> scope){
        // 業務処理
    }

    // バッチの後処理 (メール送信など)(1回のみ実行)
    global void finish(Database.BatchableContext bc){
      // 後続処理
    }
}

留意事项

  • Statefulバッチには、インスタンス変数のみがトランザクション間で値を保持できます。
  • Statefulバッチのインスタンス変数はserialization「直列化」可能なデータ型が必要です。
  • 複数バッチ並列で実行する場合、データLOCKの問題は要注意。
  • バッチのテストする時、バッチサイズを超えてテストデータを作成すると、システムエラーが発生します。バッチの対象データはバッチサイズ内に作成する必要です。

3.参照資料

23
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
16