1.2.0 • Published 5 years ago

typeorm-scheduler v1.2.0

Weekly downloads
2
License
ISC
Repository
github
Last release
5 years ago

Installation

npm install typeorm-scheduler

Example

import {Scheduler} from 'typeorm-scheduler';
import { createConnection } from 'typeorm';

await createConnection({
    type: 'sqlite',
    database: './example.db',
    entities: [Cronjob],
    logging: true,
    synchronize: true,
  });

const scheduler = new Scheduler({
  // your entity
  entity: Cronjob,

  // callback for new jobs
  async onNewJob(job: any) {
      // is called when a new job has been received
      // process your job here
  },
})


scheduler.start()

A full example is shown in the example directory.

One-time jobs

To create a one-time job you must only set the sleepUntil field of your entity. The value must be a unix timestamp. Every job whose sleepUntil field is in the past is successively processed.

import {getRepository} from 'typeorm';
import moment from 'moment'

getRepository(Cronjob).insert({..., sleepUntil: moment().format('X')})

You can set the sleepUntil value to a particular time in the future. The executing will be deferred until this time.

Repeated jobs

To create a repeated job set the interval field to your desired cron-string. The following library is used for parsing the cronstring, so see there for more informations: https://github.com/harrisiirak/cron-parser#readme

The job in the following example will be executed every five minutes.

import {getRepository} from 'typeorm';
import moment from 'moment'

getRepository(Cronjob).insert({..., sleepUntil: moment().format('X'), interval: '*/5 * * * *'})

All repeated jobs will be endless executed. If you want to stop the executing at a given time, set the repeatUntil field to your desired time.

import {getRepository} from 'typeorm';
import moment from 'moment'

getRepository(Cronjob).insert({..., interval: '*/5 * * * *', repeatUntil: moment('2021-01-01')})

Stopped jobs

If a one-time or a repeated job is finished, his sleepUntil field will be set to null. This marks the job as expired.

If you want to remove the job from the database after expiring, set the autoRemove field to true

Schedulerconfig

interface SchedulerConfig {
  /**
   * Your cronjob entity
   */
  entity: any;

  /**
   * Duration to interrupt executing before every iteration. 
   * Unit in milliseconds.
   * default: 0
   */
  nextDelay?: number;

  /**
   * Time to wait if no new job was found. 
   * Unit in milliseconds.
   * default: 100000
   */
  idleDelay?: number;

  /**
   * Duration to lock the current job in the database. 
   * Be sure that the execution finishes in this time. 
   * Unit in milliseconds.
   * default: 600000
   */
  lockDuration?: number;

  /**
   * Field name in your entity.
   * default: sleepUntil
   */
  sleepUntilFieldPath?: string;

  /**
   * Field name in your entity.
   * default: interval
   */
  intervalFieldPath?: string;

  /**
   * Field name in your entity.
   * default: repeatUntil
   */
  repeatUntilFieldPath?: string;

  /**
   * Field name in your entity.
   * default: autoRemove
   */
  autoRemoveFieldPath?: string;

  /**
   * Your callback function that gets called if a new job was found.
   * @param job founded job
   */
  onNewJob?(job: any): (any | Promise<any>);

  /**
   * Callback will be called before starting.
   */
  onStart?(): (any | Promise<any>);

  /**
   * Callback be called at ending.
   */
  onStop?(): (any | Promise<any>);

  /**
   * Callback will be called if no new job was found and before idleSleep will be called.
   */
  onIdle?(): (any | Promise<any>);

  /**
   *
   * @param err
   */
  onError?(err: any): (any | Promise<any>);
}