全部产品
云市场

开始使用定时任务

更新时间:2019-10-23 17:11:21

定时任务服务旨在为业务系统提供统一通用的任务调度服务,提供定时任务的管理监控平台,减轻业务系统开发和后续线上运维的工作量。

功能和目标

  • 提供统一的定时任务注册和管理监控平台
  • 提供集中的定时调度
  • 提供特殊时段(停机维护)的支持
  • 提供便捷的测试支持

定时任务服务端按照用户配置的定时任务信息,在到达任务执行时间时向应用发起 RPC 请求。应用收到请求后,开始执行自己预设的任务逻辑。如果是回调类型的任务,执行完毕后回调服务端。

rpc-task

  1. 开发人员和管理员在控制台界面上配置管理定时任务。
  2. 调度系统会将任务元数据固化到数据库,按照配置参数定时调用客户端。
  3. 业务集群系统接收 RPC 请求后,执行实际的业务逻辑,完成定时触发的效果。
  4. 如果是回调类型的任务,执行完毕后回调服务端。

开始使用定时任务

开始使用定时任务前,请确认您已经完成系统环境配置,详情见 前置条件

使用定时任务中间件实现定时任务功能的流程为:

  1. 开发编码
  2. 发布应用至云端
  3. 云端配置定时任务

完整的定时任务使用教程请参见 接入并配置定时任务

开发编码

Maven 依赖

在接收定时任务的模块的 pom.xml 中添加如下依赖:

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>scheduler-enterprise-sofa-boot-starter</artifactId>
  4. </dependency>

任务处理器代码

  1. public class SchedulerDemo implements ISimpleJobHandler {
  2. ThreadPoolExecutor threadPoolExecutor;
  3. @Override
  4. public String getName() {
  5. return "DEMOAPP_DEMOTASK";
  6. }
  7. @Override
  8. public ThreadPoolExecutor getThreadPool() {
  9. return threadPoolExecutor;
  10. }
  11. @Override
  12. public ClientCommonResult handle(JobExecuteContext context) {
  13. boolean success = true;
  14. // 业务逻辑代码
  15. if (success) {
  16. return ClientCommonResult.buildSuccessResult();
  17. } else {
  18. return ClientCommonResult.buildFailResult("handle failed");
  19. }
  20. }
  21. public void setThreadPoolExecutor(ThreadPoolExecutor threadPoolExecutor) {
  22. this.threadPoolExecutor = threadPoolExecutor;
  23. }
  24. }

任务处理器实现 com.alipay.antschedulerclient.handler.ISimpleJobHandler 接口及接口内的所有方法:

  • getName() 返回字符串,必须跟页面配置的任务名称一致;
  • getThreadPool() 执行该任务所用的线程池,可以每个任务处理器注入独立的线程池,也可以多个任务处理器共享一个线程池,如果返回 null 则使用公共的默认线程池;
  • handle(JobExecuteContext context) 编写任务执行逻辑,需返回 ClientCommonResult 表示任务执行结果。

Spring 配置

您可以通过以下两种方式将实现了 ISimpleJobHandler 接口的类 SchedulerDemo 声明为 Spring Bean:

  • 在 Spring XML 中定义 <bean/>。示例如下:
    1. <bean id="schedulerDemo" class="com.antcloud.tutorial.scheduler.SchedulerDemo" />
  • 使用注解驱动(annotation-driven)的方式声明 Bean。

application.properties

每个环境需要连接的服务端不一样,参见 SOFARPC 进阶指南 > RPC 引用服务 完成对应环境的 application.properties 参数调整:

  • com.alipay.env
  • com.alipay.instanceid
  • com.antcloud.antvip.endpoint

发布应用

将应用发布至云端,SOFABoot 应用的发布参见 SOFABoot 快速开始

云端配置定时任务

完成应用发布后,您需要前往微服务控制台进行定时任务的创建与管理。

新增定时任务

在定时任务控制台中,点击页面上方的 新增定时任务 按钮,按提示输入任务信息,点击 确定

定时任务

任务基本信息

  • 任务名称:推荐命名格式为 APPNAME_FUNCTION,注意需要和实际代码保持一致。
  • 应用名称:需要和工程中配置的应用名称一致,任务执行时将按照应用名称发送请求。
  • CRON 表达式:定义任务执行周期及时间的字符串。具体语法格式请参考 CRON 表达式详解。微服务平台调度中心使用 Quartz 来实现定时执行,配置规则可参见 Quartz 官网

说明:在开发联调初期,建议将 CRON 表达式设置为 0 0 0 * * ? 这种低频的形式,待开发完成后再调整为预期频率的自动执行。

高级设置

  • 路由策略
    • 随机:默认策略,每次触发都随机调用一个客户端,以达到负载均衡的目的。
    • 定向:每次触发都固定调用一个客户端,以方便排查问题,但是不支持指定调用目标。
    • 轮询:将连接到服务端的客户端 IP 地址排序,每次任务执行时按顺序选择一台客户端作为目标机器。
  • 触发类型:提供 ONEWAYCALLBACK 两种类型。
    • ONEWAY 适用于频率较高的非重要任务,执行记录不写入数据库,页面不支持查看执行记录;
    • CALLBACK 适用于低频重要任务,每次的执行记录都写入数据库,必须回调成功才算执行成功,提供多种失败处理策略,任务触发间隔必须大于 5 分钟。
  • 超时时间:适用于触发类型是 CALLBACK 的任务,为必填项。单位为分或者秒。超过此时间未回调则认为执行失败。
  • 失败处理策略:适用于触发类型是 CALLBACK 的任务,为必填项。提供三种策略:
    • 不重试
    • 重试三次
    • 重试到下次触发
  • 描述:非必填项。定时任务的详细描述,例如业务含义、影响范围等。

新增完成之后,定时任务就按照预期的频率开始定时执行了。

管理定时任务

控制台提供定时任务的查询管理功能,包括:任务开/关、手动触发、修改、删除。

在定时任务界面上,除了新增任务以外,您还可以完成如下操作:

  • 开/关:界面显示为 时,任务会自动执行;将开关滑动至 后,任务停止自动执行。
  • 触发:每手动点击一次 触发,任务就会在后台执行一次。
  • 编辑:调整任务名称、CRON、系统。
  • 删除:删除某个定时任务。

操作

注意事项

使用定时任务服务时,需要注意以下事项:

  • 单台执行:正常情况下,一次任务触发只会有一台机器执行,不会全集群同时执行;
  • 秒级触发:CRON 表达式只能精确到秒级,无法完成毫秒级的触发;
  • 幂等性控制:使用消息完成交互,要考虑异常场景下消息重投的可能性,做好幂等控制;