Cosa sono i future method

I future method sono dei metodi asincroni che girano in background e rappresentano il metodo più semplice di Apex asincrono. Ogni metodo viene accodato ed eseguito quando le risorse richieste sono disponibili.

Uno dei benefici dell’utilizzo dei future method è rappresentato dal fatto che alcuni dei limiti tipici di Apex sono raddoppiati, come per esempio il numero di query che può essere effettuata per transazione.

Come creare un future methods

Per creare un metodo future (future method appunto):

  • È necessario utilizzare il decorator @future
  • Il metodo deve essere dichiarato static e void
  • In ingresso si possono passare soltanto parametri primitivi, array o liste di parametri primitivi
  • Se si vogliono effettuare delle callout è necessario aggiungere il decorator @future(callout=true)

La struttura per la creazione di un future method è quindi la seguente:

 @future
   public static void myFutureMethod()
   {  
        // effettuare le vostre operazioni qui
   }

Il motivo per cui non possono essere passati oggetti complessi come parametri in ingresso è dovuto al fatto che questi oggetti potrebbero cambiare nel lasso di tempo che passa dalla chiamata del metodo alla sua reale esecuzione.

Se è necessario utilizzare degli oggetti complessi, il modo migliore per utilizzare i metodo future è quello di passare in ingresso una List <id> e poi effettuare la rispettiva query all’interno del metodo.

Quando utilizzare i metodi future

I principali scenari di utilizzo di un metodo future sono:

  • Callout di web services.
  • Effettuare operazioni lunghe sul database
  • Qualsiasi altra operazione che richiede molto tempo e potrebbe inficiare la user experience di un utente

Ovviamente, trattandosi di metodi semplici, tutta la logica deve essere incapsulata all’interno del metodo, quindi gli scenari di utilizzo devono essere “autoconclusivi”. 

Per esempio, se avete necessità di gestire la risposta di un web service in un altro punto del codice effettuando operazioni complesse, potreste avere necessità di utilizzare la risposta del web service in un altro metodo (ma i future method non consentono questo).

Se il flusso di informazioni che dovete sviluppare è più complesso, meglio pensare ad altri meccanismi asincroni come Queueable o Batch.

Ricorda quindi sempre che i future method sono per effettuare operazioni atomiche e di “semplice” lettura/scrittura. Se hai bisogno di gestire operazioni complesse, il metodo future non è il meccanismo asincrono corretto.

Alcuni limiti dei metodi future

I metodi future portano con sé numerosi limiti, come per esempio il non poter utilizzare come parametri in ingresso degli oggetti.

Oltre a questi limiti evidenti, ce ne sono altri da tenere in considerazione:

  • Non è possibile monitorare lo stato di esecuzione del metodo in quanto non ritorna il jobId (cosa possibile invece utilizzando Queuable e Batch).
  • Un metodo future non può essere invocato da un altro metodo future.
  • In una sola transazione possono essere invocati fino a 50 metodi future.
  • Non si possono effettuare operazioni DML miste, ovvero nello stesso metodo non si possono effettuare update su oggetti e oggetti setup, come per esempio Account e User. In questi casi si ottiene una eccezione “mixed DML Exception”

Testare i future methods

Per testare un metodo future, è necessario aspettare che il metodo finisca altrimenti potresti fare degli assert su valori non corretti.

Per poter aspettare che il metodo termini è necessario racchiudere l’invocazione del metodo future in Test.startTest() e stopTest().

Ecco di seguito uno snippet di codice che puoi utilizzare come struttura di riferimento per i tuoi test:

@isTest
private class TestFuturemethods{
   @isTest static void test1() {
       User thisUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()];
       System.runAs(thisUser) {
           Test.startTest();       
           MyClass.myfutureMethod();
           Test.stopTest();
       }
  //inserire gl iassert necessari per verificare il risultato atteso del metodo invocato
       System.assertEquals(...);

Considerazioni e best practices nell’utilizzo dei future methods

Salesforce utilizza un framework basato su coda per gestire l’esecuzione dei metodi asincroni e la coda viene utilizzata per bilanciare il carico di richieste e operare quindi al meglio.

Ecco di seguito alcune indicazioni finali, utili e pratiche per lavorare al meglio con i metodi future:

  • Evita di aggiungere troppi metodi future in esecuzione contemporaneamente.
  • Un metodo future deve eseguire le operazioni nel modo più veloce possibile. Per fare questo ci sono diversi metodi in base all’operazione che si sta eseguendo, per esempio: 
    • Inserire dei timeout quando si effettua una richiesta ad un web service
    • Inserire filtri nella condizione WHERE quando si devono processare dei dati. 

Meno record una query lavora, meno sarà il tempo di esecuzione totale.

  • A parte la classe di test che testa la funzionalità del metodo, quando si tratta di future method è necessario effettuare dei test end-to-end reali sul numero massimo di future method che si prevede di utilizzare contemporaneamente.
  • Se è necessario processare un altro numero di records, considera altri meccanismi asincroni, come per esempio i batch.

Lascia un commento

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