この記事は新社会人のSalesforce学習記録とその他 Advent Calendar 2025の5日目の記事です。
非同期処理のfutureメソッドです。
非同期処理とは
通常は処理を一つずつ行います。
例えば朝目が覚める→目覚まし時計を止める→起き上がるみたいな感じです。これは同期処理と呼ばれます。
これに対して、特定の処理をしながら別の処理を行う場合もあります。例えば、ご飯を食べながらテレビを見る感じです。これが非同期処理になります。
非同期のよいところ
待ち時間が減る
1つ目は待ち時間が減る点です。1つずつやると時間がかかる処理でも、同時にやれば時短になるはずです。
ガバナ制限が緩くなる
2つ目はガバナ制限が緩くなる点です。
ガバナ制限を知らない方のために、以下にざっくりとした説明を載せておきます。
外部APIの使用
同期処理で外部APIは呼び出せません。
非同期処理を使いましょう。
→同期処理でできてしまうと、外部APIを待つことがあり時間がかかるからだそうです。
ガバナ制限とは
ガバナ制限は、SOQLの使い過ぎによってサーバーの負荷が増大するのを防ぐもののようです。制限を超過すると、エラーが返ってきます。
例えばSOQLクエリの合計数について、通常なら100回までのところ非同期だとなんと2倍使えちゃいます。とてもお得です。
非同期4つ
非同期には4種類あるようです。
① Futureメソッド
② Batch Apex
③ Queueable Apex
④ Scheduleable Apex
なお、これらのほかにもフローで非同期を実装することもできるようです
ちなみに、@から始まる系は「アノテーション」と呼ばれます。
①のFutureメソッドを見ていきます。
Futureメソッド
public class AdventCalendar1206 {
//↓ここに@futureをつける
@future
public static void DecemberStudy(){
System.Debug('futureメソッドが動いたよ');
//SOQLでオブジェクトを取る分には問題ない
List<Account> acc=[SELECT Id,Name FROM Account];
}
}
@Futureをつければ動きます。非同期処理の実装としては、これが一番早い感じがします。が、代償としてさまざまな制約もあります。
主に長期間にわたる処理を実行する際や、外部APIにを使用する際((callout=true)を追加します。)に使われるようです。
特徴その① sObject型を引数として渡せない
ほかの非同期処理では行けるのに、Futureメソッドではオブジェクトを引数として渡せないようなっています。
メソッドを呼んでから実行するまでの間にsObjectが変更されてしまい、予期しない結果が起こる可能性があるためのようです。
ほかの非同期処理ではsObjectが使えるそうです。これは引数にとるsObjectの中身の違いによるものです。
futureメソッドでは実行されるときの状態のオブジェクトが使われます。対して、そのほかのものでは呼び出されるときにオブジェクトをコピーしてインスタンスとして保持→実行時にそのコピーを使用しているため、使用することができるようです。
つまり、Queueable Apexなどで使われているsObjectはちょっと前のものである可能性もあるということになります。
SOQLで最新のオブジェクトを呼ぶなどすれば使えます。
特徴その② 実行される瞬間がわからない
呼び出し元の処理が正常に完了し、キューに空きがあるときに実行されます。呼び出してから実行されるまでの間に間がありますが、これは実行できる状態になるまで待っている、と考えるのがいいかもしれません。
まとめ
・非同期は4種類
・@futureは、sObjectが引数でできない
・実行タイミングが不明