Skip to main content

CMQ 触发器(消息队列)

CMQ(mq) 触发器,订阅的是腾讯云的消息队列服务。

使用方式#

import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType } from '@midwayjs/decorator';import { Context, SCF } from '@midwayjs/faas';
@Provide()export class HelloTencentService {  @Inject()  ctx: Context;
  @ServerlessTrigger(ServerlessTriggerType.MQ, {    topic: 'test-topic',    tags: 'bbb',  })  async handleCMQEvent(event: SCF.CMQEvent) {    // xxx  }}

在 f deploy 后,即可。

info

注意,在腾讯云下,midway faas 提供的默认消息队列格式为 JSON

CMS 触发器配置#

属性名类型描述
topicstring接收消息的 topic
tagsstring可选,描述了该订阅中消息过滤的标签(标签一致的消息才会被推送)

示例:

监听 MQ 消息

@ServerlessTrigger(ServerlessTriggerType.MQ, {  topic: 'test-topic',  region: 'cn-shanghai'  strategy: 'BACKOFF_RETRY'})

事件结构#

CMQ 消息返回的结构如下,在 SCF.CMQEvent 类型中有描述。

{  "Records": [    {      "CMQ": {        "type": "topic",        "topicOwner": 1567,        "topicName": "testtopic",        "subscriptionName": "xxxxxx",        "publishTime": "1970-01-01T00:00:00.000Z",        "msgId": "123345346",        "requestId": "123345346",        "msgBody": "Hello from CMQ!",        "msgTag": "tag1,tag2"      }    }  ]}

本地开发#

事件类型的函数本地无法使用 dev 开发,只能通过运行 npm run test 进行测试执行。

本地测试#

和 HTTP 测试不同,通过 createFunctionApp 创建函数 app,通过 getServerlessInstance 获取整个类的实例,从而调用到特定方法来测试。

可以通过 createCMQEvent 方法快速创建平台传入的结构。

import { createFunctionApp, close } from '@midwayjs/mock';import { Framework, Application } from '@midwayjs/serverless-app';import { HelloTencentService } from '../src/function/hello_tencent';import { createCMQEvent } from '@midwayjs/serverless-scf-trigger';import { join } from 'path';
describe('test/hello_tencent.test.ts', () => {  let app: Application;  let instance: HelloTencentService;
  beforeAll(async () => {    // create app    app = await createFunctionApp<Framework>(join(__dirname, '../'), {      initContext: createInitializeContext(),    });    instance = await app.getServerlessInstance<HelloTencentService>(HelloTencentService);  });
  afterAll(async () => {    await close(app);  });
  it('should get result from cmq trigger', async () => {    expect(await instance.handleCMQEvent(createCMQEvent())).toEqual('hello world');  });});