概要
文字通り、futureメソッドを51回以上連続コールした場合に表示されるエラーです。
典型的な発生パターンはfutureメソッドの呼び出しをforループ内で行っている場合です。
trigger AccountTrigger on Account (after insert) {
for(Accoount record: trigger.new]){
AccountApiPost.futurecalls(record);
}
}
解決策
ガバナ制限回避と同じで、futureメソッドの呼び出しはforループの外側で行うようにしましょう。
trigger AccountTrigger on Account (after insert) {
List<Account> accountList = new List<Account>();
for(Accoount record: trigger.new]){
accountList.add(record);
}
AccountApiPost.futurecalls(accountList);
}
これで「Too many future calls: 51」エラーは回避可能です。
とはいえ、このままだとリストでパスされるレコード数が101以上になり「System.LimitException: Too many callouts: 101」エラーが発生してしまう危険が新たに浮上します。
従って、上記のコードを更に次のように改修します。
trigger AccountTrigger on Account (after insert) {
List<Account> accountList = new List<Account>();
for(Accoount record: trigger.new]){
accountList.add(record);
if(accountList.size() == 100){
AccountApiPost.futurecalls(accountList);
accountList.clear();
}
}
if(!accountList.isEmpty()){
AccountApiPost.futurecalls(accountList);
}
}
これによって、futureメソッドのCall上限50×1度のCalloutで処理できる最大レコード数100の5000レコードまでの一括処理が可能となります。