Apex Batches can be chained by calling the successor batch from the finish()
method of the previous batch.
But such hardcoding makes this model inflexible. It's hard to build the chain from outside, neighter from a central class
nor on runtime dependant on business logic.
The same applies when the execute()
method of Schedulable
or Queueable
classes call other classes.
Chainable
The Chainable
wrapper class of this repository overcomes those drawbacks.
finish()
methodQueueable
and Schedulable
classes as chain members new FirstBatch().setShared('result', new Money(0))
.then(AnotherBatch())
.then(QueueableJob())
.then(ScheduledJob())
...
.execute();
Chainable
class FirstBatch implements Batchable<SObject> {
Iterator<SObject> start(BatchableContext ctx) { ... }
void execute(BatchableContext ctx, List<Account> scope) { ... }
void finish(BatchableContext ctx) {
Database.enqueueBatch(new SecondBatch());
}
}
class AnotherBatch implements Batchable<SObject> {
Iterator<SObject> start(BatchableContext ctx) { ... }
void execute(BatchableContext ctx, List<Account> scope) { ... }
void finish(BatchableContext ctx) {
System.schedule('name', cron, new ScheduledJob());
}
}