feat(medusa): Option to override existing cron job (#2989)
This commit is contained in:
committed by
GitHub
parent
dc156861d4
commit
5c1d2a5e83
5
.changeset/old-scissors-develop.md
Normal file
5
.changeset/old-scissors-develop.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
feat(medusa): Option to override existing cron job
|
||||||
@@ -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 ?? {}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user