Salesforce 调用太多:数据库中有11个。可批处理

Salesforce 调用太多:数据库中有11个。可批处理,salesforce,apex-code,Salesforce,Apex Code,我的数据库中有一个代码段。可批处理 if(pageToken!=null) deleteEvents(accessToken , pageToken,c.CalendarId__c); } 删除事件功能代码为 public static void deleteEvents(String accessToken,String pageToken,String CalendarId){ while(pageToken != null) { Str

我的数据库中有一个代码段。可批处理

if(pageToken!=null)
           deleteEvents(accessToken , pageToken,c.CalendarId__c);

        }
删除事件功能代码为

public static void deleteEvents(String accessToken,String pageToken,String CalendarId){
    while(pageToken != null)
{   String re = GCalendarUtil.doApiCall(null,'GET','https://www.googleapis.com/calendar/v3/calendars/'+CalendarId+'/events?pageToken='+pageToken,accessToken);
                System.debug('next page response is'+ re);
                 re = re.replaceAll('"end":','"end1":');
re = re.replaceAll('"dateTime":','"dateTime1":');  
  JSON2Apex1 aa = JSON2Apex1.parse(re);
   List<JSON2Apex1.Items> ii = aa.items ;
  System.debug('size of ii'+ii.size());
  pageToken = aa.nextPageToken ;
 List<String> event_id =new List<String>();

           if(ii!= null){
           for(JSON2Apex1.Items i: ii){
           event_id.add(i.id);
           }
           }
  for(String ml: event_id)
  System.debug('Hello Worlds'+ml);
            for(String s:event_id)
       {
       GCalendarUtil.doApiCall(null,'DELETE','https://www.googleapis.com/calendar/v3/calendars/'+CalendarId+'/events/'+s,accessToken);

       }

 }   
    }
公共静态void deleteEvents(字符串accessToken、字符串pageToken、字符串CalendarId){
while(pageToken!=null)
{String re=GCalendarUtil.doApiCall(null,'GET','https://www.googleapis.com/calendar/v3/calendars/“+CalendarId+”/events?pageToken=”+pageToken,accessToken);
System.debug('下一页响应为'+re');
re=re.replaceAll('end:','end1:');
re=re.replaceAll(“'dateTime:”,“'dateTime1:”);
json2apex1aa=JSON2Apex1.parse(re);
清单二=aa.项目;
System.debug('ii'的大小+ii.size());
pageToken=aa.nextPageToken;
列表事件_id=新列表();
如果(ii!=null){
对于(JSON2Apex1.1.2项和2项){
事件id添加(i.id);
}
}
for(字符串ml:event\u id)
System.debug('Hello Worlds'+ml);
用于(字符串s:事件\u id)
{
GCalendarUtil.doapcall(null,'DELETE','https://www.googleapis.com/calendar/v3/calendars/“+CalendarId+”/events/'+s,accessToken);
}
}   
}

因为大约有180个事件,所以我得到了这个错误,但要删除它们,我可以选择创建一个自定义对象和一个文本字段(事件id)然后再创建一个数据库。Batchable类用于删除它们,并将其作为9或任何其他方法的批传递,以便我能够在一个数据库中执行100多个调用。Batchable interface???

10是最大值。Google的日历API似乎不支持批量删除

您可以尝试对批处理作业进行分块(传递给每个
execute()
call的记录列表的大小)。例如,类似这样的事情:

global Database.QueryLocator start(Database.BatchableContext bc){
    return Database.getQueryLocator([SELECT Id FROM Event]); // anything that loops through Events and not say Accounts
}

global void execute(Database.BatchableContext BC, List<Account> scope){
    // your deletes here
}

Database.executeBatch(new MyBatchClass(), 10); // this will make sure to work on 10 events (or less) at a time
global Database.QueryLocator启动(Database.BatchableContext-bc){
return Database.getQueryLocator([SELECT Id FROM Event]);//在事件中循环而不说Accounts的任何内容
}
全局void execute(Database.BatchableContext BC,列表范围){
//你的删除在这里
}
Database.executeBatch(新的MyBatchClass(),10);//这将确保一次处理10个事件(或更少)
另一个选择是阅读有关批次的菊花链。在execute中,您最多可以删除10个,在
finish()
方法中,您可以再次检查是否还有更多的工作要做,并且可以再次启动批处理

注意:不要使用硬编码的“10”。使用
Limits.getCallouts()
Limits.getLimitCallouts()
以便在Salesforce增加限额时自动更新



例如,在一个触发器中,您可以设置10个@future方法,每个方法都有10个调用的新限制。。。Still batch听起来是个更好的主意。

10是最大值。而且谷歌的日历API似乎不支持批量删除

您可以尝试对批处理作业进行分块(传递给每个
execute()
call的记录列表的大小)。例如,类似这样的事情:

global Database.QueryLocator start(Database.BatchableContext bc){
    return Database.getQueryLocator([SELECT Id FROM Event]); // anything that loops through Events and not say Accounts
}

global void execute(Database.BatchableContext BC, List<Account> scope){
    // your deletes here
}

Database.executeBatch(new MyBatchClass(), 10); // this will make sure to work on 10 events (or less) at a time
global Database.QueryLocator启动(Database.BatchableContext-bc){
return Database.getQueryLocator([SELECT Id FROM Event]);//在事件中循环而不说Accounts的任何内容
}
全局void execute(Database.BatchableContext BC,列表范围){
//你的删除在这里
}
Database.executeBatch(新的MyBatchClass(),10);//这将确保一次处理10个事件(或更少)
另一个选择是阅读有关批次的菊花链。在execute中,您最多可以删除10个,在
finish()
方法中,您可以再次检查是否还有更多的工作要做,并且可以再次启动批处理

注意:不要使用硬编码的“10”。使用
Limits.getCallouts()
Limits.getLimitCallouts()
以便在Salesforce增加限额时自动更新



例如,在一个触发器中,您可以设置10个@future方法,每个方法都有10个调用的新限制。。。“仍然批量”听起来是一个更好的主意。

请回答此问题。尝试最大调用次数时需要注意的一点是(目前为10次,将来会放宽限制),Apex通常允许调用操作在每个执行上下文中有最长的时间。因此,尽管您可能总共允许10个调用,但如果一个或多个调用花费的时间超过预期,您可能已经消耗了当前上下文中的总调用时间(120秒)。为此目的使用batch Apex时,将批次大小设置为每个记录1条不会有任何影响。请回答此查询时注意尝试最大数量的标注(目前为10条,将来会放宽限制)一般来说,Apex允许调用操作的每个执行上下文也有一个最大时间量。因此,尽管您可能总共允许10个调用,但如果一个或多个调用花费的时间超过预期,您可能已经消耗了当前上下文中的总调用时间(120秒)。当使用batch Apex进行此操作时,将批次大小设置为每个记录1条并没有什么坏处。