Расписание / пакет для большого количества обращений к веб-сервису?

Я новичок в Apex, и мне нужно вызывать веб-сервис для каждой учетной записи (для нескольких тысяч учетных записей).

Обычно один запрос веб-сервиса занимает от 500 до 5000 мс.

Насколько я знаю, для этой задачи требуются классы schedulable и batchable.

Моя идея заключалась в том, чтобы сгруппировать учетные записи по кодам стран (только для Европы) и запустить пакет для каждой группы.

Первая партия запускается классом schedulable, следующие - методом завершения партии:

global class AccValidator implements Database.Batchable<sObject>, Database.AllowsCallouts {

    private List<String> countryCodes;
    private countryIndex;

    global AccValidator(List<String> countryCodes, Integer countryIndex) {
        this.countryCodes = countryCodes;
        this.countryIndex = countryIndex;
        ...
    }

    // Get Accounts for current country code
    global Database.QueryLocator start(Database.BatchableContext bc) {...}

    global void execute(Database.BatchableContext bc, list<Account> myAccounts) {
        for (Integer i = 0; i < this.AccAccounts.size(); i++) {
            // Callout for every Account
            HttpRequest request ...
            Http http = new Http();
            HttpResponse response = http.send(request); 
            ...
        }
    }

    global void finish(Database.BatchableContext BC) {
        if (this.countryIndex < this.countryCodes.size() - 1) {
            // start next batch 
            Database.executeBatch(new AccValidator(this.countryCodes, this.countryIndex + 1), 200);
        }   
    }

    global static List<String> getCountryCodes() {...}
}

И мое расписание занятий:

global class AccValidatorSchedule implements Schedulable {
    global void execute(SchedulableContext sc) {
        List<String> countryCodes = AccValidator.getCountryCodes();
        Id AccAddressID = Database.executeBatch(new AccValidator(countryCodes, 0), 200);
    } 
}

Теперь я застрял с регуляторами и ограничениями выполнения Salesforces: почти для всех вызовов я получаю исключения «Истекло время чтения» или «Превышено максимальное время, отведенное для вызова (120000 мс)».

Я также пробовал асинхронные выноски, но они не работают с пакетами.

Итак, есть ли способ запланировать большое количество звонков?


person Samwise_71    schedule 23.06.2016    source источник


Ответы (1)


Вы пытались ограничить свой метод выполнения до 100? Salesforce допускает только 100 запросов на транзакцию. Т.е.

Id AccAddressID = Database.executeBatch(new AccValidator(countryCodes, 0), 100);

Возможно, это может вам помочь: https://salesforce.stackexchange.com/questions/131448/fatal-errorsystem-limitexception-too-many-callouts-101

person Danilo Goncalves    schedule 18.07.2016