Cos’è la classe Queueable?

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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *