57 lines
1.5 KiB
Markdown
57 lines
1.5 KiB
Markdown
---
|
|
title: Create Scheduled Workflows
|
|
impact: MEDIUM
|
|
impactDescription: Run workflows exactly once per time interval
|
|
tags: scheduled, cron, recurring, timer
|
|
---
|
|
|
|
## Create Scheduled Workflows
|
|
|
|
Use `@DBOS.scheduled` to run workflows on a schedule. Workflows run exactly once per interval.
|
|
|
|
**Incorrect (manual scheduling):**
|
|
|
|
```python
|
|
# Don't use external cron or manual timers
|
|
import schedule
|
|
schedule.every(1).minute.do(my_task)
|
|
```
|
|
|
|
**Correct (DBOS scheduled workflow):**
|
|
|
|
```python
|
|
@DBOS.scheduled("* * * * *") # Every minute
|
|
@DBOS.workflow()
|
|
def run_every_minute(scheduled_time, actual_time):
|
|
print(f"Running at {scheduled_time}")
|
|
do_maintenance_task()
|
|
|
|
@DBOS.scheduled("0 */6 * * *") # Every 6 hours
|
|
@DBOS.workflow()
|
|
def periodic_cleanup(scheduled_time, actual_time):
|
|
cleanup_old_records()
|
|
```
|
|
|
|
Scheduled workflow requirements:
|
|
- Must have `@DBOS.scheduled` decorator with crontab syntax
|
|
- Must accept two arguments: `scheduled_time` and `actual_time` (both `datetime`)
|
|
- Main thread must stay alive for scheduled workflows
|
|
|
|
For apps with only scheduled workflows (no HTTP server):
|
|
|
|
```python
|
|
import threading
|
|
|
|
if __name__ == "__main__":
|
|
DBOS.launch()
|
|
threading.Event().wait() # Block forever
|
|
```
|
|
|
|
Crontab format: `minute hour day month weekday`
|
|
- `* * * * *` = every minute
|
|
- `0 * * * *` = every hour
|
|
- `0 0 * * *` = daily at midnight
|
|
- `0 0 * * 0` = weekly on Sunday
|
|
|
|
Reference: [Scheduled Workflows](https://docs.dbos.dev/python/tutorials/scheduled-workflows)
|