Skip to main content

Job background workers

Job workers lets you schedule background worker functions as recurring cron jobs or as one-time runAt jobs. When a job event triggers, your function is called accordingly.

Cron jobs

Example cron jobhook

The example job worker function prints to the log each time the cron triggers.

import app from 'codehooks-js'

app.job('* * * * *', minute)
app.job('*/30 * * * *', halfPast);

function minute(req, res){
console.log("Each minute");
res.end(); // done
}

function halfPast(req, res){
console.log("Each half hour");
res.end(); // done
}

export default app.init();
tip

Utility to create CRON expressions https://crontab.guru/

  • Running jobs are stopped and re-started on each deployment (coho deploy)
  • Running jobs are stopped on undeployment (coho undeploy)

Cron Syntax

Quick reference to cron syntax.

 ┌────────────── second (optional)  0-59
│ ┌──────────── minute 0-59
│ │ ┌────────── hour 0-23
│ │ │ ┌──────── day of month 1-13
│ │ │ │ ┌────── month 1-12
│ │ │ │ │ ┌──── day of week 0-7 (0 or 7 are sunday)
│ │ │ │ │ │
│ │ │ │ │ │
* * * * * *

Example cron expressions

Run five minutes after midnight, every day

5 0 * * *

Run at 2:15pm on the first of every month

15 14 1 * *

Run at 10 pm on weekdays

0 22 * * 1-5

Schedule delayed worker function dynamically with runAt

Cron jobs are declare at deploy-time and they run forever, or until they are changed or removed by a new deployment. The schedule.runAt API is another way to create a one time job that is executed by a worker function.

Example runAt scheduled worker function

The example worker function prints the data payload to the log each time the scheduled datetime triggers.

/*
* runAt example.
*/
import {app, schedule} from 'codehooks-js'

app.worker('myworker', (data, job) => {
const {payload} = data.body
console.log('Delayed job', payload)
job.end()
})

// REST hook
app.get('/hello', async (req, res) => {
const when = new Date(Date.now() + 5000)
const data = {"message": "Hello later!"}
const worker = 'myworker'
await schedule.runAt(when, data, worker)
res.end()
});

// bind to serverless runtime
export default app.init()

If we call the /hello API the coho logs command will display the following:

dev 2023-03-23T17:37:54.198Z  Delayed job {
"message": "Hello later!"
}
dev 2023-03-23T17:37:54.940Z Delayed job {
"message": "Hello later!"
}
dev 2023-03-23T17:37:55.652Z Delayed job {
"message": "Hello later!"
}
...

Schedule worker function to run immediate

You can also execute a worker function without any delay like this:

...
schedule.run({data}, 'myworker')
...