feat(medusa): Option to override existing cron job (#2989)

This commit is contained in:
Oliver Windall Juhl
2023-02-06 14:24:32 +01:00
committed by GitHub
parent dc156861d4
commit 5c1d2a5e83
3 changed files with 44 additions and 15 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
feat(medusa): Option to override existing cron job

View File

@@ -7,7 +7,7 @@ import { StagedJob } from "../models"
import { StagedJobRepository } from "../repositories/staged-job" import { StagedJobRepository } from "../repositories/staged-job"
import { ConfigModule, Logger } from "../types/global" import { ConfigModule, Logger } from "../types/global"
import { sleep } from "../utils/sleep" import { sleep } from "../utils/sleep"
import JobSchedulerService from "./job-scheduler" import JobSchedulerService, { CreateJobOptions } from "./job-scheduler"
type InjectedDependencies = { type InjectedDependencies = {
manager: EntityManager manager: EntityManager
@@ -413,12 +413,19 @@ export default class EventBusService {
* @param handler - the handler to call on each cron job * @param handler - the handler to call on each cron job
* @return void * @return void
*/ */
createCronJob<T>( async createCronJob<T>(
eventName: string, eventName: string,
data: T, data: T,
cron: string, cron: string,
handler: Subscriber handler: Subscriber,
): void { options?: CreateJobOptions
this.jobSchedulerService_.create(eventName, data, cron, handler) ): Promise<void> {
await this.jobSchedulerService_.create(
eventName,
data,
cron,
handler,
options ?? {}
)
} }
} }

View File

@@ -13,6 +13,10 @@ type ScheduledJobHandler<T = unknown> = (
eventName: string eventName: string
) => Promise<void> ) => Promise<void>
export type CreateJobOptions = {
keepExisting?: boolean
}
export default class JobSchedulerService { export default class JobSchedulerService {
protected readonly config_: ConfigModule protected readonly config_: ConfigModule
protected readonly logger_: Logger protected readonly logger_: Logger
@@ -102,21 +106,34 @@ export default class JobSchedulerService {
* @param handler - the handler to call on the job * @param handler - the handler to call on the job
* @return void * @return void
*/ */
create<T>( async create<T>(
eventName: string, eventName: string,
data: T, data: T,
schedule: string, schedule: string,
handler: ScheduledJobHandler handler: ScheduledJobHandler,
): void { options: CreateJobOptions
): Promise<void> {
this.logger_.info(`Registering ${eventName}`) this.logger_.info(`Registering ${eventName}`)
this.registerHandler(eventName, handler) this.registerHandler(eventName, handler)
this.queue_.add( const jobToCreate = {
{ eventName,
eventName, data,
data, }
}, const repeatOpts = { repeat: { cron: schedule } }
{ repeat: { cron: schedule } }
) if (options?.keepExisting) {
return await this.queue_.add(eventName, jobToCreate, repeatOpts)
}
const existingJobs = (await this.queue_.getRepeatableJobs()) ?? []
const existingJob = existingJobs.find((job) => job.name === eventName)
if (existingJob) {
await this.queue_.removeRepeatableByKey(existingJob.key)
}
return await this.queue_.add(eventName, jobToCreate, repeatOpts)
} }
} }