Cos’è la classe Queueable e quando è bene utilizzarla? Vediamolo insieme in questo breve tutorial.
La classe Queueable rappresenta uno dei modi possibili per eseguire del codice in modo asincrono. Fra i processi asincroni in apex è l’ultimo arrivato in ordine di tempo – precisamente con la release dell’inverno del 2015 – e si pone, come metodo, a metà strada tra:
- Future Method
- Batch apex
Ti consente quindi l’utilizzo di metodi non primitivi ma evitando di creare una struttura complessa come quella dei batch.
Queueable vs Future Method: quando utilizzare uno o l’altro?
Quando si progetta un meccanismo asincrono molto spesso non si hanno ben chiari quali siano i pro e i contro di utilizzare la classe Queueable piuttosto che il Future Method.
Se infatti per l’utilizzo del Batch la scelta è più semplice – preferibile per esempio quando bisogna gestire logiche complesse, un elevato numero di record ecc. –, quando si tratta di decidere fra un Metodo Future o una classe Queuable la situazione potrebbe apparire più complessa.
Quindi, cerchiamo di rispondere prima a una domanda: perchè è stata creata l’interfaccia Queueable?
- A differenza del Future Method, la classe Queuable, quando eseguita, ritorna l’ID del job e quindi sarai in grado di monitorare il suo stato di esecuzione;
- Si possono accodare job che devono eseguire in modo sequenziale (basta far partire un Queueable alla fine di un altro);
- Rende possibile utilizzare come parametri in ingresso elementi non primitivi (oggetti).
Tutte le volte che hai bisogno di una di queste caratteristiche, allora la scelta migliore è utilizzare una Queuable.
Quando invece devi utilizzare un Metodo Future?
- Se devi effettuare semplicemente un callout, aggiornare dei records etc.;
- Se devi effettuare un refactor di un metodo già esistente che inizialmente poteva eseguire in modo sincrono, ma per sopraggiunti motivi è necessario farlo diventare una esecuzione asincrona.
Come scrivere una classe Queueable
Per scrivere una classe Queueable è necessario implementare l’interfaccia Queueable e ridefinire il metodo Execute dove dovrai inserire la logica che dovrà eseguire in modo asincrono.
Ecco un breve esempio di come creare una classe Queuable:
public class AsyncQueueableExample implements Queueable {
public void execute(QueueableContext context) {
//your logichere
}
}
Come far partire una classe Queueable
Per poter far partire il thread asincrono di esecuzione di una Queueable è sufficiente invocare, da qualche parte all’interno del codice oppure attraverso uno script nella Developer Console, come segue:
ID jobID = System.enqueueJob(new AsyncQueueableExample ());
Si può anche monitorare l’esecuzione di un job creato attraverso una Queueable effettuando la seguente query e utilizzando l’ID del job che è il risultato dell’invocazione della riga di codice precedente:
AsyncApexJob jobInfo = [SELECT Status,NumberOfErrors FROM AsyncApexJob WHERE Id=:jobID];
Accodare diversi jobs
Un’altro valido motivo per cui bisogna utilizzare i job di tipo Queueable è il fatto di poter concatenare l’esecuzione di due job.
Per farlo ti basta far partire il secondo job come ultima istruzione del Metodo Execute del primo job, come mostrato di seguito:
public class AsyncExecutionExample implements Queueable {
public void execute(QueueableContext context) {
// Your logic here
System.enqueueJob(new AsyncExecutionSecondExample ());
}
}
Testare una classe Queueable
Così come per i job di tipo Scheduler e per i Batch Apex, anche l’esecuzione di un job Queueable è asincrono.
Per poter testare in modo corretto un job Queueable è necessario assicurarsi che la sua esecuzione sia terminata prima che eseguiamo i System.assert, come nell’esempio seguente:
@isTest
public class AsyncExecutionExampleTest {
@isTest void test1() {
Test.startTest();
System.enqueueJob(new AsyncExecutionExample());
Test.stopTest();
System.assertEquals(OUR_CONDITION_HERE);
}
}
Limiti della classe Queueable
Quando lavoriamo con Apex asincrono, è piuttosto semplice incorrere nei limiti imposti dalla piattaforma.
Ecco alcuni dei principali limiti dei job Queueable:
- Il numero di massimo di job Queueable in 24 ore può essere: 250.000 oppure 200 moltiplicato per il numero di licenze acquistate per quella Org; di questi due si considera il numero più grande.
Tieni presente che questo limite non riguarda soltanto i job schedulati ma è il totale dei job asincroni che girano in 24 ore all’interno della Org: Metodi Future, Batch, Scheduler ecc. - Si possono aggiungere fino ad un massimo di 50 job in coda nella stessa transazione.
- Non esiste alcun limite di profondità per la concatenazione di diversi job, solo per le Developer edition o per le Trial, il limite di profondità è di 5 (incluso il padre).
- Esiste il limite di un solo figlio per ogni padre in ogni esecuzione.
Siamo arrivati al termine della guida sulla classe Queueable e le sue principali caratteristiche. Come sempre, ci auguriamo ti sia stata utile e chiara, alla prossima guida!