Salesforce ha un limite di timeout per le transazioni basato sull’utilizzo della CPU. Il superamento del limite di tempo della CPU di apex significa che la transazione sta impiegando troppo tempo per completare l’esecuzione del codice. Vediamo come risolvere System.LimitException: Apex CPU time Limit exceeded error in Salesforce.

Che cos’è l’errore Apex CPU Time Limit Exceeded?

Il tempo di CPU di Salesforce limita l’utilizzo a 10 secondi per le transazioni sincrone e a 60 secondi per l’elaborazione asincrona. L’errore “Apex CPU time limit exceeded” significa che la transazione sta richiedendo troppo tempo e non può essere completata.

Apex CPU Time Limit Exceeded in Salesforce
Superamento del limite di tempo della CPU di Apex in Salesforce
System.LimitException: Apex CPU time Limit exceeded

Cosa non viene conteggiato per il limite di tempo della CPU di Apex?

  • Operazioni di database come operazioni di database per DML, SOQL e SOSL.
  • Tempo di attesa per Apex Callout
  • SOQL aggregato

Come eseguire il debug del limite di tempo della CPU di Salesforce

Vediamo come eseguire il debug e risolvere il limite di tempo della CPU di Apex in Salesforce. Seguire i passaggi seguenti per controllare tutti i processi.

  • Aprire il registro di debug e selezionare un registro dalla scheda “Logs”.
  • Seleziona Debug nel menu superiore, quindi selezionare Switch Perspective. Poi, fare click su Analysis (Predefined)
debug Salesforce CPU Time Limit
  • Fare click su Timeline.
Salesforce CPU Time Limit timeline

Come risolvere il limite di tempo della CPU di Apex

Come risolvere l’errore di timeout della CPU in Salesforce

  1. Scrivere un trigger per ogni oggetto
  2. Evitare l’uso del Process Builder
  3. Usare un flusso per oggetto e per evento
  4. Evitare i nested for loop
  5. Interrompere la ricorsione nel codice Apex.

Le migliori pratiche per ridurre il timeout della CPU

È possibile fare riferimento alle Best Practice del codice Apex per ridurre il timeout della CPU. Di seguito verranno illustrati alcuni suggerimenti.

1. Evitare l’automazione multipla su un singolo oggetto

Ogni oggetto deve avere una strategia di automazione basata sulle esigenze dell’azienda e del team Salesforce che lo supporta. In generale, si dovrebbe scegliere uno strumento di automazione per ogni oggetto. Uno dei tanti scenari delle vecchie organizzazioni è quello di avere trigger Apex mescolati con flussi/processi avviati automaticamente o, più recentemente, Process Builders mescolati con flussi avviati da record. Questo può portare a una serie di problemi.

2. Trigger Framework

Seguire il Trigger Framework per evitare la ricorsione nei trigger. Il Trigger Framework assicura che i trigger siano gestiti in modo coerente e che sia necessario solo il codice necessario.

3. Evitare regole di convalida multiple (validation rules)

Le regole di convalida multiple introducono anche problemi di limiti di tempo della CPU. Evitare regole di validazione multiple su un singolo oggetto e un numero eccessivo di dichiarazioni in una singola regola di validazione.

4. Utilizzo della query basata su mappe

Usare la mappa per evitare loop aggiuntivi. Nell’esempio seguente si utilizza il ciclo for per ottenere l’id del record, aumentando il tempo di CPU.

List<Account> accList=[Select Id,Name from Account limit 100];

Set<Id> setIds=new Set<Id>();
for(Account acc: accList){ //More CPU time for sure due to looping
setIds.add(acc.id);
}

Possiamo usare la mappa per evitare un ciclo aggiuntivo come nel codice seguente. L’uso della query Map fa risparmiare tempo alla CPU.

//Fetching all account in map
Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]);

//Creating list of accounts
List<account> accList = aMap.values() ;

//Creating set of ids
Set<id> accIds = aMap.keySet() ;

5. Utilizzare Async Apex

Se possibile, provare a eseguire il processo aziendale in modo asincrono. Se si cambia il contesto, si avrà un limite elevato di 60 secondi (6X del processo sincrono). Utilizzare la funzione @Future per ottenere un limite extra per il tempo limite della cpu.

Use Async Apex

6. Uso aggregato di SOQL

Poiché il tempo del database non è calcolato nel tempo della CPU, è sempre meglio esplorare l’uso di SOQL aggregato per il vostro caso d’uso aziendale. Spingete i calcoli a livello di database per ridurre le probabilità di incorrere nel problema del time out della CPU.

7. Evitare il ciclo For annidato

I cicli for multipli e i cicli for annidati possono introdurre un errore nel tempo della CPU. Se possibile, filtrare ed elaborare solo i record selezionati nel ciclo for e utilizzare la mappa per evitare l’esecuzione di cicli for annidati.

I cicli annidati dovrebbero essere evitati nei controllori Apex, perché possono rallentare l’elaborazione della pagina o raggiungere i limiti imposti per la pagina. Un modo semplice e che dà una buona struttura al codice è quello di rendere il ciclo interno una funzione separata o di ridurre al minimo l’uso dei cicli.

Spesso ci si imbatte in codice in cui sono presenti due, tre o più loop annidati che influiscono decisamente sulle prestazioni. Un modo semplice per evitare i loop annidati è usare le mappe. Per esempio, si può trovare o creare una chiave per ogni elemento del secondo ciclo e inserire la chiave e il valore nella mappa.

8. Evitare di utilizzare il process builder

L’elaborazione del process builder introduce anche il limite di tempo della CPU di Apex. Secondo Salesforce, utilizzare Salesforce Flow per l’automazione ed evitare l’uso di process builder e workflow.

9. Salesforce Solution Design – Considerazioni sulle prestazioni

Potete date un’occhiata alla sessione seguente di Salesforce Solution Design – Considerazioni sulle prestazioni. In questa sessione ci sarà un confronto delle prestazioni tra Process Builder, Workflow e Apex Trigger.

10. Utilizzare il Return Early Pattern

Il return early è il modo di scrivere funzioni o metodi in modo che il risultato positivo atteso venga restituito alla fine della funzione e il resto del codice termini l’esecuzione.

static void someAction(Case record)
    {
        if (/*condition 1*/){
            // do stuff
            return;
        }
        if (/*condition2*/)
        {
            // do stuff
            return;
        }
        // do stuff
        return;
    }

Sintesi

In questo articolo capiamo cos’è System.LimitException: Apex CPU time Limit exceeded error in Salesforce e come evitare l’errore Apex CPU time Limit exceeded in Salesforce.

 

 

 

Fonte: tradotto da ApexHours

Share:

administrator