Эта статья — выжимка и, возможно, поможет кому-то лучше понять предназначение этого функционала и эффективнее использовать его в своих проектах. Так как по сути это одно и тоже: возможность выполнять асинхронные вычисления на платформе 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;
}
}