![見出し画像](https://assets.st-note.com/production/uploads/images/92245864/rectangle_large_type_2_bad8c941d7a0ea91abe0640225d1460e.png?width=1200)
【Apex】非同期futureメソッドについて
こんにちわ!駆け出しエンジニアの小鳥です🌞
今回は非同期処理・futureメソッドについて書きます。
※最新verを公開したのでそちらをご参照ください
ガバナ制限について別の記事でも書きましたが、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メソッドへ引数で渡して呼び出しをします。
以上になります。コードを書く記事慣れておらずわかりにくい。。
ご覧いただきありがとうございました!