前置条件

在开始使用定时任务之前,要确保服务的choerodon-starters依赖在0.6.3.RELEASE版本及之上,推荐最新版0.17.0.RELEASE

介绍

定时任务基于quartz的数据库模式,位于choerodon-asgard,消费端依赖于choerodon-starter-asgard。在页面上手动创建定时任务,定时任务支持简单定时任务和cron表达式定时任务,并指定消费端的特定方法去消费。如果下一次定时任务被触发,而上一条定时任务未被消费端执行,则该定时任务状态设置为失败。

使用

消费端添加依赖

  1. <dependency>
  2. <groupId>io.choerodon</groupId>
  3. <artifactId>choerodon-starter-asgard</artifactId>
  4. <version>${choerodon.starters.version}</version>
  5. </dependency>

消费端的配置

  1. choerodon:
  2. schedule:
  3. consumer:
  4. enabled: true # 启用任务调度消费端
  5. thread-num: 1 # 任务调度消费线程数
  6. poll-interval-ms: 1000 # 拉取间隔,默认1000毫秒

@JobTask定义一个可执行程序

@JobTask参数

  1. public @interface JobTask {
  2. /**
  3. * 最大重试次数
  4. *
  5. * @return 最大重试次数
  6. */
  7. int maxRetryCount() default 1;
  8. /**
  9. * 方法执行参数
  10. *
  11. * @return 方法执行参数
  12. */
  13. JobParam[] params() default {};
  14. /**
  15. * 事务超时时间(秒)。默认永不超时。
  16. *
  17. * @return 事务超时时间(秒)
  18. */
  19. int transactionTimeout() default -1;
  20. /**
  21. * 是否为只读事务
  22. *
  23. * @return 是否为只读事务
  24. */
  25. boolean transactionReadOnly() default false;
  26. /**
  27. * 事务的隔离级别
  28. *
  29. * @return 事务的隔离级别
  30. */
  31. Isolation transactionIsolation() default Isolation.DEFAULT;
  32. /**
  33. * 所用的事务管理器的bean名
  34. *
  35. * @return 所用的事务管理器的bean名
  36. */
  37. String transactionManager() default "";
  38. /**
  39. * 方法编码
  40. *
  41. * @return 方法编码
  42. */
  43. String code();
  44. /**
  45. * 方法描述
  46. *
  47. * @return 方法描述
  48. */
  49. String description() default "";
  50. /**
  51. * 方法层级
  52. *
  53. * @return 方法层级
  54. */
  55. ResourceLevel level() default ResourceLevel.SITE;
  56. }

@JobTask使用

  1. @Component
  2. public class Task {
  3. private static final Logger LOGGER = LoggerFactory.getLogger(Task.class);
  4. @JobTask(code = "test",
  5. maxRetryCount = 2, params = {
  6. @JobParam(name = "isInstantly", defaultValue = "true", type = Boolean.class),
  7. @JobParam(name = "name", defaultValue = "zh"),
  8. @JobParam(name = "age", type = Integer.class)
  9. })
  10. public Map<String, Object> test(Map<String, Object> data) {
  11. LOGGER.info("data {}", data);
  12. Object age = data.get("age");
  13. if (age != null) {
  14. data.put("age", (Integer)age + 1);
  15. }
  16. return data;
  17. }
  18. }

注意事项

  • @JobTask注解的方法参数必须为Map。
  • @JobParam为执行参数, 类型需要为String,Integer,Long,Double,Boolean之一,如果没有设置默认值则创建定时任务时必须指定方法参数。
  • @JobTask注解的方法返回值为Map或者为void。如果返回值为void则传入的参数为前端传入,不会改变;如果为Map,则下一次的执行参数为上一次执行的返回值,可以动态改变。

创建定时任务

在前端页面的任务调度 –> 任务明细 –> 创建任务,填入任务执行参数以及扫描到的服务执行方法后创建任务。

@TimedTask定义定时任务

@JobTask只是定义一个可执行程序,具体触发时间要在前端页面创建定时任务,而@TimedTask注解可以定义一个带有触发时间的可执行程序,无需在页面创建

@TimedTask参数

  1. public @interface TimedTask {
  2. /**
  3. * 定时任务名称
  4. */
  5. String name();
  6. /**
  7. * 定时任务描述
  8. */
  9. String description();
  10. /**
  11. * 是否只执行一次,true:只执行一次;false:每次部署时执行一次
  12. */
  13. boolean oneExecution();
  14. /**
  15. * 方法执行参数
  16. */
  17. TaskParam[] params();
  18. /**
  19. * simple-trigger的重复次数
  20. */
  21. int repeatCount();
  22. /**
  23. * simple-trigger的重复间隔值:重复间隔形如 '100SECONDS' 则为100
  24. */
  25. long repeatInterval();
  26. /**
  27. * simple-trigger的重复间隔单位:重复间隔形如 '100SECONDS' 则为SECONDS
  28. */
  29. QuartzDefinition.SimpleRepeatIntervalUnit repeatIntervalUnit();
  30. }

@TimedTask使用

  1. @Component
  2. public class Task {
  3. @TimedTask(name = "同步LDAP用户", description = "自定义定时任务", oneExecution = true,
  4. repeatCount = 0, repeatInterval = 100, repeatIntervalUnit = QuartzDefinition.SimpleRepeatIntervalUnit.HOURS, params = {
  5. @TaskParam(name = "organizationCode", value = "hand")
  6. })
  7. public void syncLdapUserSite(Map<String, Object> map) {
  8. // 执行方法
  9. }
  10. }