Y

yoho-quartz

yoho quartz

309004bc 日志 · by iknitting

说明文档

总体说明

任务中心在quartz的基础上进行包装与定制。主要提供如下功能:

  1. 通过注解和sdk两种方式注册任务
  2. 任务的misfired机制
  3. 任务的fail-over功能
  4. 通过运维页面进行任务的查看,启停编辑等。
  5. 查看任务最近10次的执行情况,及重新执行某次任务。
  6. 任务执行失败告警及任务misfired告警。

任务处理流程图

任务处理流程

业务集成

业务侧需要添加如下maven依赖,引入任务管理客户端包。

    <dependency>
      <groupId>com.yoho.quartz</groupId>
      <artifactId>yoho-quartz-client</artifactId>
      <version>1.3.4-SNAPSHOT</version>
    </dependency>

有两种任务注册方式

注解方式注册

注解为YhJobDef。注解中配置任务的相关信息,如执行时间,开始时间,结束时间,任务misfired策略,任务类型,任务执行的参数等。

定义如下:

public @interface YhJobDef {

    /**
     * 任务名称
     *
     * @return
     */
    String jobName();

    /**
     * 任务分组
     *
     * @return
     */
    String jobGroup() default "default";

    /**
     * 任务触发类型 0-crontrigger类型,1-simpletrigger类型
     *
     * @return
     */
    JobType jobType() default JobType.CRON;

    /**
     * 执行周期 ,当为crontrigger类型时生效
     *
     * @return
     */
    String cron() default "";

    /**
     * 任务misfired策略
     *
     * @return
     */
    MisfiredPolicy misfiredPolicy() default MisfiredPolicy.SMART_POLICY;

    /**
     * 任务执行上下文
     */
    String context() default "";

    /**
     * 开始时间 格式为yyyy-MM-dd HH:mm:ss ,当类型为1时有效
     *
     * @return
     */
    String startDate() default "";

    /**
     * 重复次数,当任务类型为1时有效
     *
     * @return
     */
    int repeatCount() default 0;

    /**
     * 重复间隔 ,当任务类型为1时有效
     *
     * @return
     */
    int interval() default 0;

    /**
     * 任务优先级
     *
     * @return
     */
    int priority() default 5;

    /**
     * 任务描述
     *
     * @return
     */
    String desc() default "";
}

注解方式注册任务代码示例:

@Service
@YhJobDef(jobName = "CmbScheduleYhTask", cron = "0 15 2,3,4 * * ?", desc = "每天凌晨刷新招行公钥", misfiredPolicy = MisfiredPolicy.SMART_POLICY, jobType = JobType.CRON)
public class CmbScheduleYhTask implements YhJob {
    private static final Logger cmbpayLogger = LoggerFactory.getLogger("cmbpayLogger");
    @Autowired
    private CmbNetpayService cmbpayService;

    @Override
    public void process(String s) {
        cmbpayLogger.info("\n\n******************** CmbNetpay PublicKey");
        cmbpayService.refreshCmbPublicKey();
        cmbpayLogger.info("\n");
    }
}

任务具体执行逻辑类需要定义成一个不同的spring的bean。

调用接口方式注册

通过接口的方式只需要调用JobOperatorService的createJob方法就可以将任务注册到任务中心。方法定义void createJob(JobDetail jobDetail , String channel) throws JobException 参数JobDetail对象为任务的定义。channel为任务注册的来源。即通过注解还是通过调用接口。枚举值为annotation和portal

代码示例:

    @Resource(name = "jobOperatorService")
    private JobOperatorService jobOperatorService;

    /**
     * 添加任务
     */
    @RequestMapping("/job/createJob.do")
    public JobResponse createJob(@RequestBody JobDetail jobDetail) {
        JobResponse response = new JobResponse();
        try {
            jobOperatorService.createJob(jobDetail, Contants.ChannelType.TYPE_PORTAL);
            response.setCode(ConstantEnum.JobResponse.SUCCESS);
            response.setDesc("SUCCESS");
        } catch (JobException e) {
            response.setCode(ConstantEnum.JobResponse.FAIL);
            response.setDesc(e.getMessage());
        }
        return response;


    }

任务misfired策略说明

对于cron类型的任务,提供如下策略

IGNORE_MISFIRE_POLICY(-1),SMART_POLICY(0),CRON_FIRE_ONCE_NOW(1),CRON_DO_NOTHING(2)

  • IGNORE_MISFIRE_POLICY 当策略为-1时,会将之前misfired的所有周期的job trigger一遍,直到当前任务执行周期。
  • SMART_POLICY CRON_FIRE_ONCE_NOW CronTrigger的默认策略是0,与1策略一样,资源准备完成后执行一次,即将nextfiretime设置成当前时间。等待有资源后调用。若一直没资源,那么会一直被misfired,直到有资源,立即被执行一次,然后就是正常的调用了。
  • CRON_DO_NOTHING 啥也不干,然后等待正常的调用。

对于simple类型的任务,提供如下策略

IGNORE_MISFIRE_POLICY(-1),SMART_POLICY(0), SIMPLE_FIRE_NOW(1),SIMPLE_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT(2),SIMPLE_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT(3),SIMLE_RESCHEDULE_NEXT_WITH_REMAINING_COUNT(4),SIMPLE_RESCHEDULE_NEXT_WITH_EXISTING_COUNT(5);

  • IGNORE_MISFIRE_POLICY 同cornTrigger的策略[获取到资源后,立即执行,将错过的任务执行。然后按照正常频率执行]
  • SMART_POLICY 若当前任务只执行一次,那么其策略选取SIMPLE_FIRE_NOW 若当前任务无限次执行,则其策略为SIMLE_RESCHEDULE_NEXT_WITH_REMAINING_COUNT 其他场景任务策略为:SIMPLE_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
  • SIMPLE_FIRE_NOW 立刻执行。eg:若任务定义为18:00执行,每10min执行一次,执行5次,那么正常情况下执行的时间点为[18:00,18:10,18:20,18:30,18:40],若在18:09分宕机,直到18:25才恢复,那么下次执行的点就是18:25,最终执行的时间点为:[18:00,18:25,18:35,18:45,18:55,19:05].此处执行了6次。从代码里也能看出,fire now策略只改变了触发时间,而没有改变重复次数。

  • SIMPLE_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT 当前时间点立即执行一次,然后以该时间点开始,IntervalInSeconds为时间间隔,依次执行。执行次数不变。eg:例子中的执行时间点为[18:00,18:25,18:35,18:45,18:55]

  • SIMPLE_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT 当前时间点立刻执行,以后以该时间点开始,依次执行。如果有错过的任务,则就丢弃,不再执行。

  • SIMLE_RESCHEDULE_NEXT_WITH_REMAINING_COUNT 下一个周期点执行,之前的错过的任务就错过了,不再执行。eg:若任务定义为18:00执行,每10min执行一次,执行5次,那么正常情况下执行的时间点为[18:00,18:10,18:20,18:30,18:40],若在18:09分宕机,直到18:27才恢复,那么下次执行的点就是18:30,其中18:10和18:20两次任务就不再执行了,最终执行的时间点为:[18:00,18:30,18:40]

  • SIMPLE_RESCHEDULE_NEXT_WITH_EXISTING_COUNT 保证任务执行次数不丢。计算下一个执行点开始执行。eg: 若任务定义为18:00执行,每10min执行一次,执行5次,那么正常情况下执行的时间点为[18:00,18:10,18:20,18:30,18:40],若在18:09分宕机,直到18:27才恢复,那么下次执行的点就是18:30。任务最终的执行时间点为:[18:00,18:30,18:40,18:50,19:00]

任务优先级

任务优先级是数字类型,值越大,优先级越高。优先级只对同一时间点触发的trigger有效 。

配置文件说明

yoho-quartz对quartz的配置文件quartz.properties做了隐藏。一般配置采用默认值。若业务侧有特殊要求,可以修改默认配置。业务侧的配置文件为classpath:custom-quartz.properties

运维侧任务查看

运维侧提供页面查看任务执行状态及相关的任务操作。

进入运维页面,可以看到所有任务的列表: 任务列表

该列表可以看到任务的基本信息,并可以启动,停止,编辑和查看某一任务进几次的执行结果。

点击查看,可以看到任务的执行结果: 任务执行结果查看

该页面提供了任务的再次执行功能,点击重新执行后,任务会重新执行一次。