はじめに
裏技というほどでもないが、知っておくと意外と便利なテクニック。
本文
通常、バッチクラスやfutureメソッドから、新しくfutureメソッドをコールすることはガバナ制限により許されない。
しかし、キュー可能クラスをバイパスすることでこの制限を回避することができる。
バッチクラスはSystem.enqueueJobで1トランザクションにつき1度までキュー可能クラスのApexジョブをキューできる。
またキュー可能クラスのトランザクションでは同期Apexのトランザクションと同様に50回までfutureメソッドをコールすることが可能。
この仕様を利用し、バッチクラス→キュー可能クラス→(上限50まで)futureメソッド という順に実行するように実装すれば、実質的にバッチクラスから1トランザクションにつき50回までのfutureメソッドのコールが可能ということになる。
使いみち
自分の場合、バッチクラスから処理対象のレコード1件ごとに個別でコールアウトをしなければならないという要件に対応するため利用した。
バッチクラスから直接コールアウトする場合、ガバナ制限により100回までしか行えないが、futureメソッドをコールしてトランザクションを増やせば、バッチの1チャンクあたり、最大50×100の5000回までコールアウトが可能ということになり、かなり制約が緩くなる(キュー可能クラスをチェーンさせればこの上限をさらに引き伸ばせる)。
注意点
当たり前の話だが、非同期Apexの実行回数が爆発的に増えるので、Lightning Platform フォームの Apex 制限には要注意。
