見出し画像

【Apex】非同期futureメソッドについて

こんにちわ!駆け出しエンジニアの小鳥です🌞
今回は非同期処理・futureメソッドについて書きます。

ガバナ制限について別の記事でも書きましたが、SOQL クエリの制限やヒープサイズ制限など、一部のガバナ制限値が高くなるのが非同期処理です。
イメージとしては同期処理が即時反映で、非同期処理はキューに入って処理(待ち行列に並んで順番に呼ばれるみたいな)される感じです。空きをみて順番を待ってくれるのでガバナ制限が高いんですね!

夜間にまとめて処理をしたいといった場合はバッチスケジュールというものがあるため、そちらは後日改めて・・・。

・非同期処理@futureの使い方

非同期処理をしたいメソッドのうえに@futureアノテーションを書くだけ

global class FutureClass
{
    @future
    public static void myFutureMethod()
    {   
         // Perform some operations
    }
}

しかし他にたくさんルールがあります。
・void 型のみを返し、静的メソッド(static)である必要があります。
24 時間あたりの future メソッドの最大呼び出し数は、250,000 または組織のユーザライセンス数の 200 倍のいずれか大きい方
・future メソッドはコールされた順序で実行されるとは限らない
・future メソッドから future メソッドをコールできない
・引数はプリミティブデータ型、プリミティブデータ型の配列、プリミティブデータ型のコレクションのみ
・引数にsObject またはオブジェクトをとれない。
こちらの対応方法の具体例を残しておきます。
だめな理由としては、メソッドをコールしてからそのメソッドを実行するまでの間に sObject が変更されてしまう可能性があるためだそう。

-----NG例-----
@future
public static void createTask(List<Opportunity> newOpps){
}                 👆。

-----対策-----
@future
public static void createTask(Set<Id> oppId){
 Task task = [SELECT Id FROM Task WHERE WhatId in : oppId];
  ...
} 

public static void SetId(List<Opportunity> Opps){
 Set<Id> a = new Set<Id>();
 for(Opportunity Opp : Opps){
  ...
  }
 createTask(...)
}

対策として、Id型で受け取りSOQLをすることで対象のレコードをひっぱってきます。しかしトリガー側からTrigger.newなどのコンテキスト変数は渡せないので、futureじゃない別メソッドを用意してsObjectで受け取り、Idセットを用意して@futureメソッドへ引数で渡して呼び出しをします。

以上になります。コードを書く記事慣れておらずわかりにくい。。
ご覧いただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?