# mongo-scaled-scheduler

> This project allows you to schedule jobs to be run across a cluster of NodeJS services, where you want to ensure only 1 job is triggered at a time.

Latest version **1.4.4** (published 2024-03-18) · MIT license · 0 weekly downloads

## Install

```sh
npm install mongo-scaled-scheduler
pnpm add mongo-scaled-scheduler
yarn add mongo-scaled-scheduler
bun add mongo-scaled-scheduler
```

## Health

**Score 30/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.4.4 |
| Published | 2024-03-18 |
| First published | 2023-04-08 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 1 |
| Unpacked size | 21.7 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Mark Wylde |
| Maintainers | markwylde |
| Keywords | schedule, scheduler, task, job, mongo, scaled, distributed |

## Links

- npm: https://www.npmjs.com/package/mongo-scaled-scheduler
- npm.io page: https://npm.io/package/mongo-scaled-scheduler

## Dependencies (1)

- [mongodb](https://npm.io/package/mongodb.md) ^6.5.0

## Alternatives

- [angular-pipes](https://npm.io/package/angular-pipes.md) — 5.6K weekly downloads
- [@ng-web-apis/midi](https://npm.io/package/@ng-web-apis/midi.md) — 2.6K weekly downloads
- [happn-3](https://npm.io/package/happn-3.md) — 1.6K weekly downloads
- [@opensip-cli/lang-go](https://npm.io/package/@opensip-cli/lang-go.md) — 1.2K weekly downloads
- [mongoose-typescript](https://npm.io/package/mongoose-typescript.md) — 85 weekly downloads

## Recent versions

- 1.4.4 (latest) — 2024-03-18
- 1.4.3 — 2024-03-18
- 1.4.2 — 2024-03-18
- 1.4.1 — 2023-08-31
- 1.4.0 — 2023-08-01
- 1.3.2 — 2023-07-11
- 1.3.1 — 2023-04-09
- 1.3.0 — 2023-04-08
- 1.2.0 — 2023-04-08
- 1.1.0 — 2023-04-08
- 1.0.0 — 2023-04-08

## README

# mongo-scaled-scheduler

This project allows you to schedule jobs to be run across a cluster of NodeJS services, where you want to ensure only 1 job is triggered at a time.

## Installation
```bash
npm install --save mongo-scaled-scheduler
```

## Getting Started
```javascript
import { MongoClient } from 'mongodb';
import createScheduler from 'mongo-scaled-scheduler';

const mongoDbUrl = 'mongodb://localhost:27017/mydatabase';
const client = await MongoClient.connect(mongoDbUrl);
const db = client.db();

const scheduler = await createScheduler({
  collection: db.collection('scheduler'),
});
```

## Examples
### Immediate
This will run immediately on a random running instance

```javascript
scheduler.addJob(async function () {
  const notes = db.collection('notes');
  await notes.insertOne({ test: Date.now() });
});
```

### Set time
This will run once in 10 seconds time.

```javascript
scheduler.addJob(async function () {
  const notes = db.collection('notes');
  await notes.insertOne({ test: Date.now() });
}, { time: Date.now() + 10000 });
```

### Set interval
This will run in 10 seconds time, and then again every 10 seconds.

```javascript
scheduler.addJob(async function () {
  const notes = db.collection('notes');
  await notes.insertOne({ test: Date.now() });
}, { interval: 10000 });
```

### Immediate and interval
This will run immediatly and then again every 10 seconds.

```javascript
scheduler.addJob(async function () {
  const notes = db.collection('notes');
  await notes.insertOne({ test: Date.now() });
}, { time: Date.now(), interval: 10000 });
```

### Remove a job
This will add a job and then remove it.

```javascript
const jobId = scheduler.addJob(async function () {
  const notes = db.collection('notes');
  await notes.insertOne({ test: Date.now() });
});

scheduler.removeJob(jobId);
```

## Notes
### `addJob`'s options are:
- `id`: a unique id for the job. Will default to a hash of the function stringified
- `title`: add a title to the mongo document
- `time`: what time will the job first run?
- `interval`: milliseconds in which the job will continuously rerun

If `id` is not provided, then a `sha256` hash of the stringified function will be used. This should work in most cases, unless you want to have the same function run multiple jobs. In which case, give each job a unique `id`.

### node crashes during execution
While a scheduled job is running, it will update the mongo document every second with a `lastPing` of the current time. If there is no ping within `10` seconds, then it is assumed the node process crashed mid execution and allow the next interval to run.

### job rejects during execution
If a job rejects during execution it will not rerun that try, but if there is an interval it will try again at the next interval.

## Error Handling

In case of errors during the execution of a job, the scheduler will emit an 'error' event. You can handle these errors by adding an event listener:

```javascript
scheduler.on('error', (error) => {
  console.error('An error occurred while executing a job:', error);
});
```

---
_Source: https://npm.io/package/mongo-scaled-scheduler · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
