Agenda 定时任务唯一条件的用法
2021-05-06 本文已影响0人
思考蛙
使用 Agenda 做定时任务时,agenda 是允许我们设定唯一任务,这个场景是我们有时可能需要随时改变这个定时任务的时间,来延迟或提前触发它。
示例如下:
一、定义任务
// 订单交付(服务完成)
await this.agendaService.define(OrderState.DELIVERED, async (job) => {
const { uniqueId, state } = job.attrs.data;
await this.userOrderService.internalTransitionToState(uniqueId, state);
});
我们 define 了一个定时交付状态改变的任务
二、建立索引
await this.agendaService._collection.createIndex({ 'data.type': 1, 'data.uniqueId': 1 }, {
name: 'findAndUpdateUniqueJobIndex',
unique: true,
});
这里创建了两个内嵌入文档的索引记录:
data.type data.uniqueId,建立索引的目的是令任务查询时高效,不会占用过多的 mongodb cpu
image.png
三、创建定时任务
// 主要应用:改变订单状态
await this.agendaService.create(OrderState.DELIVERED, {
type: 'order',
uniqueId: event.serviceOrder.id,
state: OrderState.DELIVERED,
}).unique({
'data.type': 'order',
'data.uniqueId': event.serviceOrder.id,
}).schedule(new Date(event.serviceOrder.endDate))
.save();
以上代码就是一个完整的定义唯一条件的定时任务