由于salesforce没有睡眠方法,因此我创建了一个辅助函数来使用Web服务等待特定的超时时间
public class SalesforceHelper {
public static void waitCall(String timeout){
System_Settings__c lnpSetting = System_Settings__c.getValues('System Properties');
String endpoint=lnpSetting.Base_Endpoint_URL__c + 'salesforceHelper/wait?timeout=' + timeout;
system.debug('====endpoint======'+endpoint);
HttpRequest httpReq=new HttpRequest();
HttpResponse httpResp = new HttpResponse();
Http http = new Http();
httpReq.setMethod('GET');
httpReq.setEndpoint(endpoint);
String username=lnpSetting.Endpoint_Username__c;
String password=lnpSetting.Endpoint_Password__c;
Blob headerValue = Blob.valueOf(username + ':' + password);
String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue);
httpReq.setHeader('Authorization', authorizationHeader);
httpReq.setHeader('content-type','application/json; charset=utf-8');
httpReq.setTimeout(120000);
try{
httpResp = http.send(httpReq);
System.debug('Wait response' + httpResp);
} catch (Exception e) {
system.debug(LoggingLevel.Error, 'Error HTTP response code = ' + httpResp.getStatusCode() + '; calling '+endpoint );
}
}
}
然后在匿名窗口中,运行以下代码:
System.debug('Staring call wait call: ' + System.now().format('HH:mm:ss.SSS'));
SalesforceHelper.waitCall('50000');
System.debug('Finish call wait call: ' + System.now().format('HH:mm:ss.SSS'));
Custom_Record__c[] record = new List<Custom_Record__C>();
Integer counter = 0;
while (record.size() == 0 && counter < 10){
System.debug('Staring call wait call for counter + ' + counter + ': ' + System.now().format('HH:mm:ss.SSS'));
SalesforceHelper.waitCall('60000');
System.debug('Finish call wait call for counter + ' + counter + ': ' + System.now().format('HH:mm:ss.SSS'));
counter++;
rec = new List<Custom_Record__C>();
}
上面的代码假定执行以下操作,首先等待50秒钟,然后“查询”记录,但是它返回空值,然后使用计数器循环并尝试“查询”记录10次。
但是,当我运行代码时,我意识到只有50秒的等待运行和前两个60秒的等待运行成功,循环中的其余8个调用甚至没有命中Web服务,并且当我检查调试日志时我发现了System.HttpRequest[Endpoint=null, Method=null]
和System.HttpResponse[Status=null, StatusCode=0]
,为什么会这样?以及如何解决此问题?
PS:我想要的原始方法是因为Custom_Record__c可能在以后的调用方法运行时尚未创建,所以我需要一种方法来等待外部库创建它以供使用。我不能永远等待,所以我使用计数器来控制它,而我遇到了这个问题。