[SalesForce] Dynamically Scheduling Apex to Run at Various Points in Time

I see a lot of documentation on scheduling Apex to run repeatedly (i.e. every day at 1am), or even run once at a specific point in time, but I don't see anything about dynamically scheduling Apex to run, for example, 5 or 10 minutes from now.

My use case is that our Salesforce org will be receiving messages from an external system at random times, and every time it does, we need to store a token from that system, and pass it to a single scheduled Apex class that will run an hour later. So each class will be running with a different parameter, and at random points in time.

My first thought is that one could try to use system.now() and a Cron expression (i.e. String sch = '20 30 8 10 2 ?') to dynamically generate a Cron expression for each job that is scheduled, but that seems overly complicated.

Is there a way to simply specify in Apex "run this five minutes from now?"

Many thanks

Best Answer

The only "schedule X from now" is for Batchable:

System.scheduleBatch(new BatchClassImpl(), 'Near Future', 5);

This would schedule a job five minutes from now to run the batch job.

For anything else, you would indeed want to build your own cron string, which shouldn't be more than a dozen lines of code in most cases; you could even write a utility method if this is a common design across multiple Schedulable classes.

You could also technically use a Flow with a Pause element then call some Apex, or use Process Builder, but that involves metadata configuration instead of "just" Apex.

Related Topic