全部产品

定时任务--基于消息

更新时间:2020-07-23 15:41:16

本文介绍基于消息的定时任务所涉及的整个流程,主要包括下述几个部分:

背景知识

基于消息的定时任务是基于 SOFABoot 开发的。在本地开发前,请确保对下述内容有一定了解。

本地开发

在本地使用 SOFABoot 框架实现定时服务,主要包括下述步骤:

  1. 搭建环境
  2. 创建 SOFABoot Web 工程。可采用下述任一方式:
  3. 引入依赖:在接收定时任务的模块(例如示例工程的 app/endpoint 模块)的 pom.xml 中添加如下依赖。
    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>mq-enterprise-sofa-boot-starter</artifactId>
    4. </dependency>
  4. 业务逻辑编写:要实现接口 UniformEventMessageListener。主要待实现方法为 onUniformEvent()

    展开查看:消息任务示例
    1. public class MsgJobDemo implements UniformEventMessageListener {
    2. /**
    3. * logger
    4. */
    5. private static final Logger LOGGER = LoggerFactory.getLogger(MsgJobDemo.class);
    6. @Override
    7. public void onUniformEvent(UniformEvent uniformEvent, UniformEventContext uniformEventContext) throws Exception {
    8. // 所有消息定时任务的Topic 统一为 TP_F_SC
    9. final String topic = uniformEvent.getTopic();
    10. // 消息事件码 即是页面配置的 消息任务事件码
    11. final String eventCode = uniformEvent.getEventCode();
    12. // 接收触发后的定时业务处理
    13. LOGGER.info("[Receive an uniformEvent] topic {} eventcode {} eventId {} payload {}",
    14. new Object[]{topic, eventCode, uniformEvent.getId()});
    15. // todo 处理业务逻辑
    16. }
    17. }
  5. Spring 配置:需要进行消费订阅端配置,需要配置的内容包括下述几个方面。

    • 配置路径:src/main/resources/META-INF/xxx/xxx-xxx.xml
    • 配置内容:

      • 消息主题:例如 <sofa:channel value="TP_F_SC">
      • 消息事件码:例如 eventCode="EC_TASK_SCHEDULERTUTORIAL_MSG_DEMO"
      • 消息订阅组:例如 group="S_SCHEDULERTUTORIAL_MSG_DEMO"
      • sofa:listener 元素的 ref 属性:值为实现消息监听器的类名。例如 <sofa:listener ref="schedulerDemo"/>
      展开查看:消息任务配置示例
      1. <!-- consumer declaration, the id and group attribute are required and their value must be unique -->
      2. <sofa:consumer id="uniformEventSubscriber" group="S_SCHEDULERTUTORIAL_MSG_DEMO">
      3. <sofa:listener ref="schedulerDemo"/>
      4. <sofa:channels>
      5. <!-- channel value is the involved topic -->
      6. <sofa:channel value="TP_F_SC">
      7. <!-- each event represents a subscription -->
      8. <sofa:event eventType="direct" eventCode="EC_TASK_SCHEDULERTUTORIAL_MSG_DEMO" persistence="false"/>
      9. </sofa:channel>
      10. </sofa:channels>
      11. <sofa:binding.msg_broker/>
      12. </sofa:consumer>
      13. <!-- messageListener listener bean declaration, implements com.alipay.common.event.UniformEventMessageListener -->
      14. <bean id="msgJobDemo" class="com.alipay.sofa.endpoint.task.MsgJobDemo"/>
  6. application.properties 配置:在云端发布前,请务必进行 application.properties 配置。更多详情,请参考 引入 SOFA 中间件。配置步骤如下:

    展开查看配置步骤

    1. 请前往 SOFAStack 控制台 > 研发效能 > 脚手架 > Step 2,示例如下:
      脚手架截图从中获取下述信息:
      • 实例标识:应用实例在工作空间中的唯一标识,在 application 中对应的 key 为:com.alipay.instanceid
      • AntVIP:应用通过 AntVIP 来获取各个组件的服务端地址,每个区域一个地址。在 application 中对应的 key 为 com.antcloud.antvip.endpoint。不同环境的 AntVIP 地址值,见下述规定。
        • 杭州金区VPC:100.103.201.136
        • 上海非金:100.103.1.174
    2. 脚手架 控制台,点击右上角用户图像,选择 AccessKey Management,在跳转的页面中即可获取访问控制对应的属性值。 这些属性在 application 中对应的 key 分别为:

      • Access Key IDcom.antcloud.mw.access
      • Access Secretcom.antcloud.mw.secret

        说明:如果需要创建 AccessKey,可点击 获取 AK。更多详情,请参见 创建 AccessKey

    3. 配置运行模式和运行环境,示例如下:

      1. run.mode=NORMAL
      2. com.alipay.env=shared
    4. 将上述属性键和值,配置在 application.properties 文件中。

云端发布

定时功能暂不支持通过本地启动应用的方式进行体验。如要体验该功能,必须先将应用发布到云端服务器。

  • 应用整体的发布流程,请参考 技术栈使用指南 中的 技术栈与应用发布流程
  • 应用的详细发布步骤,建议参考 经典应用服务 下的 快速入门

控制台配置

完成本地编码后,需要在服务端管控台中提交相关的配置,涉及定时任务、消息类型、订阅关系等。

  • 定时任务配置:请参考 配置定时任务 完成配置。

    注意:任务名称需要和代码中的 eventCode 保持一致。配置定时任务

  • 消息类型和订阅关系配置:请参考 消息队列 中的消息类型、订阅关系部分在消息队列控制台上新增消息主题、消费组以及订阅关系。

    注意:消息主题、消息事件码、消息订阅组需要和代码中保持一致。

日志确认

在 SOFAStack 平台上部署示例应用后,您需要通过日志来确认是否已经开始正常运行。步骤如下:

  1. 登录 ECS:在 SOFAStack 平台上,通过网页端 SSH 登录至 schedulertutorial 的 ECS。
  2. 访问消息队列传来的日志:路径为 /home/admin/logs/tracelog/msg-sub-digest.log。日志内容示例如下:
    1. 2017-07-04 22:06:13.334,schedulertutorial,0ba5c708149917717403218544734,0.1.50bafee1,48502cafabf3ae16cbc29896f5cb4752,a1446577617326be85d2853a95c9b098,^8LFHHIA4ZPEX$TP_F_SC,EC_TASK_SCHEDULERTUTORIAL_DEMO,^000001$P-scheduler-prod,00,656B,37ms,dms-server-shared-1-1,0,msgWorkTP-1954168392-1-thread-1,,