Timer 触发器(定时任务)
定时任务触发器用于定时执行一个函数。定时有两种方式,时间间隔(every)和 cron 格式。
info
温馨提醒,测试函数后请及时关闭触发器自动执行,避免超额扣费。
使用方式
import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType } from '@midwayjs/decorator';
import { Context, FC } from '@midwayjs/faas';
@Provide()
export class HelloAliyunService {
@Inject()
ctx: Context;
@ServerlessTrigger(ServerlessTriggerType.TIMER, {
type: 'cron',
value: '0 0 4 * * *', // 每天4:00触发 https://help.aliyun.com/document_detail/68172.html
})
async handleTimerEvent(event: FC.TimerEvent) {
this.ctx.logger.info(event);
return 'hello world';
}
}
在 npm run deploy
后,即可。
Timer 配置
属性名 | 类型 | 描述 | |
---|---|---|---|
type | 'cron' | 'every' | 必填,触发类型,分别代表 cron 表达式,固定时间间隔。 |
value | string | 必填,cron 表达式或者 every 值。every 时最小时间间隔 1 分钟,固定单位分钟 | |
payload | string | 可选,一个固定传递的值,很少用 | |
info
注意,FC 使用的是 UTC 时间,和传统的中国时区不同。
示例:
cron 表达式
@ServerlessTrigger(ServerlessTriggerType.TIMER, {
type: 'cron',
value: '0 0 4 * * *', // 每天4:00触发
})
cron 表达式可以查看 文档。
every 表达式
@ServerlessTrigger(ServerlessTriggerType.TIMER, {
type: 'every',
value: '5m', // 每隔 5 分钟,最小为 1 分钟
})
事件结构
Timer 消息返回的结构如下,在 FC.TimerEvent
类型中有描述。
{
triggerTime: new Date().toJSON(),
triggerName: 'timer',
payload: '',
}
本地开发
事件类型的函数本地无法使用 dev 开发,只能通过运行 npm run test
进行测试执行。
本地测试
和 HTTP 测试不同,通过 createFunctionApp
创建函数 app,通过 getServerlessInstance
获取整个类的实例,从而调用到特定方法来测试。
可以通过 createTimerEvent
方法快速创建平台传入的结构。
import { createFunctionApp, close } from '@midwayjs/mock';
import { Framework, Application } from '@midwayjs/serverless-app';
import { HelloAliyunService } from '../src/function/hello_aliyun';
import { createTimerEvent, createInitializeContext } from '@midwayjs/serverless-fc-trigger';
import { join } from 'path';
describe('test/hello_aliyun.test.ts', () => {
let app: Application;
let instance: HelloAliyunService;
beforeAll(async () => {
// create app
app = await createFunctionApp<Framework>(join(__dirname, '../'), {
initContext: createInitializeContext(),
});
instance = await app.getServerlessInstance<HelloAliyunService>(HelloAliyunService);
});
afterAll(async () => {
await close(app);
});
it('should get result from timer trigger', async () => {
expect(await instance.handleTimerEvent(createTimerEvent())).toEqual('hello world');
});
});
关闭触发器
如果不再使用,请务必关闭触发器或者直接删除。