「Too many future calls: 51」エラーについて

By | June 20, 2020

概要

文字通り、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レコードまでの一括処理が可能となります。