Skip to main content

Interval scheduling

Interval scheduling runs missions at fixed time intervals.

Syntax

schedule: every N units

Time units

UnitExamples
secondsevery 30 seconds
minutesevery 15 minutes
hoursevery 6 hours
daysevery 1 day
weeksevery 1 week

Examples

Seconds

// Every 30 seconds (for real-time sync)
schedule: every 30 seconds

Minutes

// Every 5 minutes
schedule: every 5 minutes

// Every 15 minutes
schedule: every 15 minutes

// Every 30 minutes
schedule: every 30 minutes

Hours

// Hourly
schedule: every 1 hour

// Every 2 hours
schedule: every 2 hours

// Every 6 hours
schedule: every 6 hours

// Every 12 hours
schedule: every 12 hours

Days

// Daily
schedule: every 1 day

// Every 2 days
schedule: every 2 days

Weeks

// Weekly
schedule: every 1 week

// Bi-weekly
schedule: every 2 weeks

Interval vs cron

Interval

  • Runs at fixed intervals from start time
  • Simpler to configure
  • Less precise timing
schedule: every 6 hours
// Runs at: start, start+6h, start+12h, ...

cron

  • Runs at specific times
  • More control
  • Predictable times
schedule: cron "0 */6 * * *"
// Runs at: 0:00, 6:00, 12:00, 18:00

Start time

Intervals start from:

  1. Daemon start time (for new missions)
  2. Last run time (for existing missions)

First run behavior

mission ImmediateStart {
schedule: every 1 hour
runImmediately: true // Run once at start
}

mission DelayedStart {
schedule: every 1 hour
runImmediately: false // Wait for first interval
}

Combining with options

With retry

mission RobustSync {
schedule: every 15 minutes

retryOnFailure: {
maxAttempts: 3,
backoff: exponential
}
}

With concurrency control

mission ControlledSync {
schedule: every 5 minutes
skipIfRunning: true // Don't overlap
}

With timeout

mission TimedSync {
schedule: every 1 hour
timeout: 1800000 // 30 minute timeout
}

Use cases

Real-time sync

mission RealtimeSync {
schedule: every 30 seconds

action Sync {
get "/events" { since: lastSync }
store response -> events { key: .id }
}
}

Hourly updates

mission HourlySync {
schedule: every 1 hour

action Sync {
get "/data"
store response -> data { key: .id }
}
}

Daily reports

mission DailyReport {
schedule: every 1 day

action Generate {
get "/stats/daily"
store response -> reports { key: formatDate(now(), "YYYY-MM-DD") }
}
}

Weekly cleanup

mission WeeklyCleanup {
schedule: every 1 week

action Cleanup {
for item in oldData where .createdAt < addDays(now(), -30) {
delete oldData[item.id]
}
}
}

Best practices

Choose appropriate intervals

Data TypeRecommended Interval
Real-time events30 seconds - 5 minutes
Transactional data5-15 minutes
Reference data1-6 hours
ReportsDaily
Cleanup jobsWeekly

Account for execution time

// If sync takes 10 minutes
schedule: every 15 minutes // Good: 5 minute buffer

// Not:
schedule: every 5 minutes // Risk: overlapping runs

Use skipIfRunning

mission SafeSync {
schedule: every 5 minutes
skipIfRunning: true

action Sync {
// Long-running sync
}
}

Add jitter for distributed systems

mission JitteredSync {
schedule: every 1 hour
jitter: 300000 // +/- 5 minutes random delay
}

Troubleshooting

Runs too frequently

Check interval unit:

// This runs every 30 SECONDS
schedule: every 30 seconds

// This runs every 30 MINUTES
schedule: every 30 minutes

Runs overlapping

Add skipIfRunning:

schedule: every 5 minutes
skipIfRunning: true

Missed runs

Intervals don't backfill. If daemon was down for 2 hours with 30-minute interval, you won't get 4 runs.

Consider:

  • Using runImmediately: true
  • Adding catch-up logic
  • Using incremental sync with since: lastSync