• 前置条件

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

    介绍

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

    使用

    消费端添加依赖

    <dependency>
        <groupId>io.choerodon</groupId>
        <artifactId>choerodon-starter-asgard</artifactId>
        <version>${choerodon.starters.version}</version>
    </dependency>
    

    消费端的配置

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

    @JobTask定义一个可执行程序

    @JobTask参数

    public @interface JobTask {
    
        /**
         * 最大重试次数
         *
         * @return 最大重试次数
         */
        int maxRetryCount() default 1;
    
        /**
         * 方法执行参数
         *
         * @return 方法执行参数
         */
        JobParam[] params() default {};
    
        /**
         * 事务超时时间(秒)。默认永不超时。
         *
         * @return 事务超时时间(秒)
         */
        int transactionTimeout() default -1;
    
        /**
         * 是否为只读事务
         *
         * @return 是否为只读事务
         */
        boolean transactionReadOnly() default false;
    
        /**
         * 事务的隔离级别
         *
         * @return 事务的隔离级别
         */
        Isolation transactionIsolation() default Isolation.DEFAULT;
    
    
        /**
         * 所用的事务管理器的bean名
         *
         * @return 所用的事务管理器的bean名
         */
        String transactionManager() default "";
    
        /**
         * 方法编码
         *
         * @return 方法编码
         */
        String code();
    
        /**
         * 方法描述
         *
         * @return 方法描述
         */
        String description() default "";
    
        /**
         * 方法层级
         *
         * @return 方法层级
         */
        ResourceLevel level() default ResourceLevel.SITE;
    }
    

    @JobTask使用

    @Component
    public class Task {
        private static final Logger LOGGER = LoggerFactory.getLogger(Task.class);
    
        @JobTask(code = "test",
                maxRetryCount = 2, params = {
                @JobParam(name = "isInstantly", defaultValue = "true", type = Boolean.class),
                @JobParam(name = "name", defaultValue = "zh"),
                @JobParam(name = "age", type = Integer.class)
        })
        public Map<String, Object> test(Map<String, Object> data) {
            LOGGER.info("data {}", data);
            Object age = data.get("age");
            if (age != null) {
                data.put("age", (Integer)age + 1);
            }
            return data;
        }
    }
    

    注意事项

    创建定时任务

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

    @TimedTask定义定时任务

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

    @TimedTask参数

    public @interface TimedTask {
        /**
         * 定时任务名称
         */
        String name();
        /**
         * 定时任务描述
         */
        String description();
        /**
         * 是否只执行一次,true:只执行一次;false:每次部署时执行一次
         */
        boolean oneExecution();
        /**
         * 方法执行参数
         */
        TaskParam[] params();
        /**
         * simple-trigger的重复次数
         */
        int repeatCount();
        /**
         * simple-trigger的重复间隔值:重复间隔形如 '100SECONDS' 则为100
         */
        long repeatInterval();
        /**
         * simple-trigger的重复间隔单位:重复间隔形如 '100SECONDS' 则为SECONDS
         */
        QuartzDefinition.SimpleRepeatIntervalUnit repeatIntervalUnit();
    }
    
    

    @TimedTask使用

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