-
Notifications
You must be signed in to change notification settings - Fork 3.3k
feat: crons for all bin scripts, new jobs:handle-schedules script, more reliable job system crons #13564
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
📦 esbuild Bundle Analysis for payloadThis analysis was generated by esbuild-bundle-analyzer. 🤖
Largest pathsThese visualization shows top 20 largest paths in the bundle.Meta file: packages/next/meta_index.json, Out file: esbuild/index.js
Meta file: packages/payload/meta_index.json, Out file: esbuild/index.js
Meta file: packages/payload/meta_shared.json, Out file: esbuild/exports/shared.js
Meta file: packages/richtext-lexical/meta_client.json, Out file: esbuild/exports/client_optimized/index.js
Meta file: packages/ui/meta_client.json, Out file: esbuild/exports/client_optimized/index.js
Meta file: packages/ui/meta_shared.json, Out file: esbuild/exports/shared_optimized/index.js
DetailsNext to the size is how much the size has increased or decreased compared with the base branch of this PR.
|
DanRibbens
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I should have brought this up on the earlier PR that added payload.jobs.handleSchedules() but then it was seemingly used only internally. Now you're exposing it so we should make sure we want to stick with it or not.
| pnpm payload jobs:run --cron "*/5 * * * *" --queue myQueue --handle-schedules # This will both schedule jobs according to the configuration and run them | ||
| ``` | ||
|
|
||
| If you only want to handle schedules, you can use the dedicated `jobs:handle-schedules` bin script: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would prefer to call it just jobs:schedule.
payload.jobs.handleSchedules() is also verbose, payload.jobs.schedule() would have been fine.
What do you think?
…-handle-schedules
|
🚀 This is included in version v3.56.0 |
Fixes #13744
New jobs:handle-schedules bin script
Similarly to
payload jobs:run, this PR adds a newjobs:handle-schedulesbin script which only handles scheduling.Allows jobs:run bin script to handle scheduling
Similarly to how payload autoRun handles both running and scheduling jobs by default, you can now set the
payload jobs:runbin script to also handle scheduling. This is opt-in:Cron schedules for all bin scripts
Previously, only the
payload jobs:runbin script accepted a cron flag. Thepayload jobs:handle-scheduleswould have required the same logic to also handle a cron flag.Instead of opting for this duplicative logic, I'm now handling cron logic before we determine which script to run. This means: it's simpler and requires less duplicative code.
This allows all other bin scripts (including custom ones) to use the
--cronflag, enabling cool use-cases like scheduling your own custom scripts - no additional config required!Example:
pnpm payload run ./myScript.ts --cron "0 * * * *"Video Example:
Screenshot.2025-08-22.at.17.28.07.mp4
More reliable job system crons
When using autorun or
--cron, if one cron run takes longer than the cron interval, the second cron would run before the first one finishes.This can be especially dangerous when running jobs using a bin script, potentially causing race conditions, as the first cron run will take longer due to payload initialization overhead (only for first cron run, consecutive ones use cached payload). Now, consecutive cron runs will wait for the first one to finish by using the
{ protect: true }property of Croner.This change will affect both autorun and bin scripts.
Cleanup
getPayloadfunction arguments were not properly typed. Arguments likedisableOnInit: trueare already supported, but the type did not reflect that. This simplifies the type and makes it more accurate.Fixes
allQueuesargument forpayload jobs:runwas not respected