simple-job-scheduler
Version:
A simple job scheduling system written in TypeScript
46 lines • 4.45 kB
JavaScript
import { Logger } from 'simple-logging-system';
import { Job } from './Job';
const logger = new Logger('Scheduler');
export class Scheduler {
constructor() {
this.indexedJobsByName = new Map();
}
schedule(jobName, runnable, intervalInMillis) {
const existingJob = this.indexedJobsByName.get(jobName);
if (existingJob !== undefined) {
logger.warn(`There is already a job named "${jobName}" running, the new job will not be scheduled.`);
return existingJob.job;
}
logger.info(`Scheduling job "${jobName}" that is running every ${intervalInMillis}ms.`);
const newJob = new Job(jobName, runnable, intervalInMillis, () => this.cancelInternal(jobName));
const intervalId = setInterval(() => newJob.execute(), intervalInMillis);
this.indexedJobsByName.set(jobName, { job: newJob, intervalId });
return newJob;
}
cancel(jobName) {
const existingJob = this.indexedJobsByName.get(jobName);
if (existingJob === undefined) {
logger.warn(`Trying to cancel job "${jobName}", but it does not exist.`);
return false;
}
return existingJob.job.cancel();
}
cancelAll() {
this.indexedJobsByName.forEach((jobContainer) => jobContainer.job.cancel());
}
runningJobs() {
return Array.from(this.indexedJobsByName.values()).map((jobContainer) => jobContainer.job);
}
cancelInternal(jobName) {
const existingJob = this.indexedJobsByName.get(jobName);
if (existingJob === undefined) {
logger.warn(`Trying to cancel job "${jobName}", but it does not exist.`);
return false;
}
clearInterval(existingJob.intervalId);
this.indexedJobsByName.delete(jobName);
return true;
}
static get [Symbol.for("___CTOR_NAME___")]() { return "Scheduler"; }
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9TY2hlZHVsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFPdkMsTUFBTSxPQUFPLFNBQVM7SUFHcEI7UUFDRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDM0QsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFlLEVBQUUsUUFBNkIsRUFBRSxnQkFBd0I7UUFDL0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsT0FBTywrQ0FBK0MsQ0FBQyxDQUFDO1lBQ3JHLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQztTQUN4QjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLE9BQU8sMkJBQTJCLGdCQUFnQixLQUFLLENBQUMsQ0FBQztRQUN4RixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFlO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLE9BQU8sMkJBQTJCLENBQUMsQ0FBQztZQUN6RSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFTyxjQUFjLENBQUMsT0FBZTtRQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixPQUFPLDJCQUEyQixDQUFDLENBQUM7WUFDekUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0NBQ0YifQ==