@clairejs/server 3.27.3 → 3.27.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/job/AbstractJobScheduler.d.ts +1 -0
- package/dist/job/AbstractJobScheduler.js +1 -1
- package/dist/job/AwsJobScheduler.d.ts +3 -0
- package/dist/job/AwsJobScheduler.js +31 -4
- package/dist/job/LocalJobScheduler.d.ts +1 -0
- package/dist/job/LocalJobScheduler.js +3 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,6 +29,7 @@ export declare abstract class AbstractJobScheduler {
|
|
|
29
29
|
* @param id The job id returned from scheduleJobAt function
|
|
30
30
|
*/
|
|
31
31
|
protected abstract cancelJob(id: string): Promise<void>;
|
|
32
|
+
protected abstract retryJob(payload: AbstractJob): Promise<void>;
|
|
32
33
|
/**
|
|
33
34
|
* Remove the scheduled job and prevent if from running in the future
|
|
34
35
|
* @param id The job id returned from scheduleJobAt function
|
|
@@ -148,7 +148,7 @@ export class AbstractJobScheduler {
|
|
|
148
148
|
//-- retry by reschedule the job
|
|
149
149
|
update.retryCount = (job.retryCount || 0) + 1;
|
|
150
150
|
const retryDelay = job.retryDelayMs || 0;
|
|
151
|
-
await this.
|
|
151
|
+
await this.retryJob({ ...job, ...update, at: Date.now() + (retryDelay < 60000 ? 60000 : retryDelay) });
|
|
152
152
|
}
|
|
153
153
|
else {
|
|
154
154
|
if (job.cron) {
|
|
@@ -15,7 +15,10 @@ export declare class AwsJobScheduler extends AbstractJobScheduler {
|
|
|
15
15
|
constructor(logger: AbstractLogger, db: AbstractDbAdapter, jobRepo: AbstractJobRepository, apiLambdaFunctionArn: string, apiLambdaFunctionRoleArn: string, jobNamespace: string);
|
|
16
16
|
handleCron(jobInfo: AbstractJob): Promise<void>;
|
|
17
17
|
private convertCronToSchedulerExpression;
|
|
18
|
+
private getJobName;
|
|
19
|
+
private getOneTimeExpression;
|
|
18
20
|
protected getScheduledJobs(): Promise<AbstractJob[]>;
|
|
21
|
+
protected retryJob(payload: AbstractJob): Promise<void>;
|
|
19
22
|
protected _scheduleJob(jobInfo: AbstractJob): Promise<void>;
|
|
20
23
|
cancelJob(jobId: string): Promise<void>;
|
|
21
24
|
}
|
|
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
};
|
|
10
10
|
import { AbstractLogger, Errors, LogContext } from "@clairejs/core";
|
|
11
11
|
import { AbstractDbAdapter } from "@clairejs/orm";
|
|
12
|
-
import { SchedulerClient, CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, ListSchedulesCommand, ScheduleState, ActionAfterCompletion } from "@aws-sdk/client-scheduler";
|
|
12
|
+
import { SchedulerClient, CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, ListSchedulesCommand, ScheduleState, ActionAfterCompletion, UpdateScheduleCommand } from "@aws-sdk/client-scheduler";
|
|
13
13
|
import { AbstractJobScheduler } from "./AbstractJobScheduler";
|
|
14
14
|
import { AbstractJobRepository } from "./AbstractJobRepository";
|
|
15
15
|
/**
|
|
@@ -56,6 +56,13 @@ let AwsJobScheduler = class AwsJobScheduler extends AbstractJobScheduler {
|
|
|
56
56
|
}
|
|
57
57
|
return parts.join(" ");
|
|
58
58
|
}
|
|
59
|
+
getJobName(jobId) {
|
|
60
|
+
return `${this.jobNamespace}${jobId}`;
|
|
61
|
+
}
|
|
62
|
+
getOneTimeExpression(at) {
|
|
63
|
+
const date = new Date(at);
|
|
64
|
+
return `at(${date.toISOString().replace(/\.\d{3}Z$/, '')})`;
|
|
65
|
+
}
|
|
59
66
|
async getScheduledJobs() {
|
|
60
67
|
try {
|
|
61
68
|
const listCommand = new ListSchedulesCommand({
|
|
@@ -89,6 +96,28 @@ let AwsJobScheduler = class AwsJobScheduler extends AbstractJobScheduler {
|
|
|
89
96
|
return [];
|
|
90
97
|
}
|
|
91
98
|
}
|
|
99
|
+
async retryJob(payload) {
|
|
100
|
+
this.logger.debug("Retrying job: ", payload);
|
|
101
|
+
if (payload.at) {
|
|
102
|
+
if (payload.cron) {
|
|
103
|
+
//- retry a cron job
|
|
104
|
+
await this._scheduleJob({ ...payload, id: `${payload.id}-retry-${payload.retryCount}` });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
//- retry a one-time job, update the schedule
|
|
108
|
+
const jobName = this.getJobName(payload.id);
|
|
109
|
+
const schedule = await this.scheduler.send(new GetScheduleCommand({
|
|
110
|
+
Name: jobName,
|
|
111
|
+
GroupName: schedulerGroupName,
|
|
112
|
+
}));
|
|
113
|
+
const updateCommand = new UpdateScheduleCommand({
|
|
114
|
+
...schedule,
|
|
115
|
+
ScheduleExpression: this.getOneTimeExpression(payload.at),
|
|
116
|
+
});
|
|
117
|
+
await this.scheduler.send(updateCommand);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
92
121
|
async _scheduleJob(jobInfo) {
|
|
93
122
|
this.logger.debug("Scheduling job: ", jobInfo);
|
|
94
123
|
if (jobInfo.cron || jobInfo.at) {
|
|
@@ -96,9 +125,7 @@ let AwsJobScheduler = class AwsJobScheduler extends AbstractJobScheduler {
|
|
|
96
125
|
let scheduleExpression;
|
|
97
126
|
let flexibleTimeWindow;
|
|
98
127
|
if (jobInfo.at) {
|
|
99
|
-
|
|
100
|
-
const date = new Date(jobInfo.at);
|
|
101
|
-
scheduleExpression = `at(${date.toISOString().replace(/\.\d{3}Z$/, '')})`;
|
|
128
|
+
scheduleExpression = this.getOneTimeExpression(jobInfo.at);
|
|
102
129
|
// Add flexible time window for one-time jobs to handle slight delays
|
|
103
130
|
flexibleTimeWindow = {
|
|
104
131
|
Mode: "OFF",
|
|
@@ -54,6 +54,7 @@ export declare class LocalJobScheduler extends AbstractJobScheduler implements I
|
|
|
54
54
|
exit(): void;
|
|
55
55
|
protected getScheduledJobs(): Promise<AbstractJob[]>;
|
|
56
56
|
syncJobs(): Promise<void>;
|
|
57
|
+
protected retryJob(payload: AbstractJob): Promise<void>;
|
|
57
58
|
protected _scheduleJob(jobInfo: AbstractJob): Promise<void>;
|
|
58
59
|
protected cancelJob(jobId: string): Promise<void>;
|
|
59
60
|
}
|
|
@@ -154,6 +154,9 @@ let LocalJobScheduler = class LocalJobScheduler extends AbstractJobScheduler {
|
|
|
154
154
|
}
|
|
155
155
|
return;
|
|
156
156
|
}
|
|
157
|
+
async retryJob(payload) {
|
|
158
|
+
return await this._scheduleJob(payload);
|
|
159
|
+
}
|
|
157
160
|
async _scheduleJob(jobInfo) {
|
|
158
161
|
if (this.isActive) {
|
|
159
162
|
//-- case each job type
|