2016-06-23 1 views
1

Je suis nouveau sur Apex et je dois appeler un webservice pour chaque compte (pour quelques milliers de comptes).Calendrier/lot pour un grand nombre d'appels de service Web?

Habituellement, une seule requête de service Web prend de 500 à 5000 ms. Pour autant que je sache, des classes ordonnables et pouvant être battues sont nécessaires pour cette tâche. Mon idée était de regrouper les comptes par codes de pays (Europe uniquement) et de lancer un lot pour chaque groupe.

Le premier lot est lancé par la classe planifiable, les suivantes commencent dans la méthode d'arrivée en lots:

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() {...} 
} 

Et ma classe horaire:

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

maintenant Je suis coincé avec les gouverneurs d'exécution forces de vente et limites: Pour presque toutes les légendes, je reçois les exceptions "Lecture expirée" ou "Temps maximum dépassé alloué pour légende (120000 ms)". J'ai également essayé les appels asynchrones, mais ils ne fonctionnent pas avec les lots.

Alors, existe-t-il un moyen de planifier un grand nombre de légendes?

Répondre