Queueable VS Future methods

Эта статья — выжимка и, возможно, поможет кому-то лучше понять предназначение этого функционала и эффективнее использовать его в своих проектах. Так как по сути это одно и тоже: возможность выполнять асинхронные вычисления на платформе Force.com.

Если посмотреть в хронологическом порядке, то первым для этих целей был реализован Batchable интерфейс. Но это был единственный асинхронный код в какой-то момент. Он был слишком «тяжелым» с точки зрения использования ресурсов, с ним было связано много логики которую нужно было реализовать и это занимало много времени при разработке.

Итак, следующими пришли Future methods. В отличие от методов Batchable, они требовали меньше ресурсов и идеально подходили для выполнения той работы, которую Batchable делал раньше, но гораздо эффективнее. К сожалению, это было слишком эффективно. Вы не знали, когда было выполнено задание, sObject не передавались в качестве аргументов в future methods, потому что sObject может изменяться между временем вызова метода и временем его выполнения. В этом случае future methods может получит старые значения sObject и может перезаписать их.

И, наконец, последняя реализация асинхронного кода – это Queueable. Предполагалось, что Queueable будет гибридом между ограниченными Future methods и ресурсоёмким интерфейсом Batchable.

Future methods

Работает в фоновом режиме, асинхронно. Вы можете вызвать будущий метод для выполнения длительных операций, которую вы хотели бы запустить в своем собственном потоке.

Преимущества:

  • простота использования (просто добавляете в метод аннотацию @future);

  • повышенные лимиты для SQOL, DML и т. д.;

  • Future methods выполняются в отдельном контексте.

Недостатки:

  • передаваемыми параметрами метода могут быть только примитивней типы массивы примитивов или коллекции;

  • метод должен быть статичным и возвращать тип void;

  • вы не можете вызывать из future methods другие future methods;

  • вы не можете получить Job ID для мониторинга процесса.

Пример кода:

@future

public static void myFutureMethod()

// Perform some operations

}

Queueable interface

Queueable job аналогичны future methods в том, что они оба находятся в очереди на выполнение, но Queueable interface предоставляет вам дополнительные преимущества.

Преимущества:

  • повышенные лимиты для SQOL, DML аналогично future methods;

  • возможность передать sQbject тип в ваш класс реализующий интерфейс Queueable; эти объекты могут быть доступны при выполнении задания;

  • возможность запускать внутри Queueable job дочерние Queueable job, то есть делать цепочку;

  • возможность запустить сразу несколько Queueable job, но в цепочки из родительской очереди можно запускать одновременно лишь одну дочернею очередь;

  • возможность получить Job ID для мониторинга процесса выполнения.

Недостатки:

  • в цепочки Queueable jobs в метод System.enqueueJob можно добавлять только по одной очереди (это означает для каждой родительской очереди одновременно может существовать только одна дочерняя);

  • вы можете добавить 50 очередей за одну транзакцию в метод System.enqueueJob;

  • для того, чтобы сделать callout, нужно реализовать интерфейс маркер Database.AllowsCallouts.

Пример кода:

public class AsyncExecutionExample implements Queueable {

public void execute(QueueableContext context) {

Account a = new Account(Name='Acme',Phone='(415) 555-1212');

insert a;

}

}
5 Likes