springBoot+quartz搭建自动任务平台(对多个项目)

序:

      这次的场景是关于自动任务,希望跟业务平台解耦,同时可以支持动态修改任务执行时间,可以暂停、恢复、修改、删除等,另外还想带管理页面,避免繁琐的配置文件,可灵活交互,对接多项目支持。这些就是自动任务平台的特征,那么怎么实现呢?画流程图,想清楚场景,同时分清平台与业务系统的边界。

  • 逻辑时序图

  • 自动任务技术选型

SpringBoot + quartz + mysql + redis + web

  • 计划实现的功能
  1. 业务数据转任务数据存库
  2. 防复调机制
  3. 异步通知执行结果
  4. 多公司项目共用权限机制(暂不实现,后面有时间再增加)
  5. quartz拥有的实时操作功能,如暂停、恢复、修改、删除
  6. 日志记录:任务执行记录、任务操作记录(修改、暂停、删除记录)
  • 实现逻辑简述

第一步:

业务系统:业务系统按照自动任务平台要求传参(主要参数,任务执行时间周期、任务回调业务地址)。

任务平台:创建注册自动任务,反馈创建结果。

第二步:

任务平台:创建成功后任务平台开始循环任务,到时间点做逻辑判断,查看上次任务调用是否完成,执行回调,调用业务地址,业务系统异步返回调用成功,记录执行记录。

第三步:

(业务系统)业务系统执行相关业务,调用任务平台,反馈执行批次的执行结果(防止复调,使用redis实现)

第四步:

任务平台:清除执行批次缓存,更新执行记录。等待下次执行时刻

  • 任务平台计划提供的接口与页面
  1. 登录页面、公司、项目权限(双鉴权,授权信息校验、sign加密串校验)
  2. 任务管理界面
  3. 创建任务接口
  4. 任务执行时刻表查询接口
  5. 任务执行结果查询接口
  6. 业务系统反馈执行结果接口
  7. quartz拥有的实时操作功能:暂停、恢复、删除

其中、236优先处理。

  • 技术预研搭建的界面

界面要根据我们的平台要求修改,但是美化肯定不擅长,先实现功能。

 

  • 风险点
  1. 网络风险,任务平台调用业务平台失败
  2. 由1导致的任务执行失败,怎么补偿
  3. 由1导致的任务执行失败,是否要像设备解析平台一样提供重调(如果是高密度自动任务,重调有时间重合怎么处理?)

任务平台的性能瓶颈(接入项目多了,自动任务多,执行密度大,是否能抗住?)

   上面说的是大致方案,详细方案,我也不会在这里写出来。但是呢,技术实现还是可以大致讲下。

静态页面访问

springBoot + web的框架,这里就不多说了。唯一提下静态页面文件允许访问,避免拦截的实现。

关键代码:

@Configuration
public class WebAppConfigurer extends WebMvcConfigurationSupport  {
    
    @Autowired
    private ApiAuthMapper apiAuthMapper;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将url带static访问静态资源的映射到static文件目录
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }

}

    其实就是配置类,继承WebMvcConfigurationSupport,重写资源拦截方法addResourceHandlers,里面主要是设置映射关系。注意这个不能又多个,否则可能失效,具体哪个先执行后执行跟加载机制有关,有的说继承WebMvcConfigurerAdapter。这个方法貌似已经过时,但是我觉得会有加载顺序问题导致失效,后面研究。

quartz的job里不能注解service、mapper

任务工厂

@Component
public class CustomJobFactory extends AdaptableJobFactory  {
    @Autowired    
    private AutowireCapableBeanFactory capableBeanFactory;    
    
    @Override    
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {    
        //调用父类的方法    
        Object jobInstance = super.createJobInstance(bundle);    
        //进行注入    
        capableBeanFactory.autowireBean(jobInstance);    
        return jobInstance;    
    }  
}

自定义一个job工厂,继承AdaptableJobFactory,同时使用spring的注解@Component交由spring管理。来里面重写创建任务实例方法,调用父类方法,实现自动注入。

调度器配置

@Configuration
public class SchedulerConfig {
    
    private JobFactory jobFactory;

    public SchedulerConfig(JobFactory jobFactory){
        this.jobFactory = jobFactory;
    }


    @Bean(name="SchedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setQuartzProperties(quartzProperties());
        factory.setJobFactory(jobFactory);
        return factory;
    }

    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        //在quartz.properties中的属性被读取并注入后再初始化对象
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
  
    /*
     * quartz初始化监听器
     */
    @Bean
    public QuartzInitializerListener executorListener() {
       return new QuartzInitializerListener();
    }
    
    /*
     * 通过SchedulerFactoryBean获取Scheduler的实例
     */
    @Bean(name="Scheduler")
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }

}

做完上面的操作,你自己的job类就可以使用注解标签了

@Slf4j
public class CronUnifyJob implements Job {
    
    @Autowired
    private ApiAuthMapper authMapper;

    @Autowired
    private ApiJobMapper apiJobMapper;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

          //your business code

    }

}

解耦的执行机制

我这里的设计思路就是在上面your business code里做文章,这里采取回调业务系统接口的办法实现解耦。我想到这你懂了,至于实现防复调,也在在这里使用redis跟任务执行结果反馈接口配合使用。

最后说明

     防复调思路请放飞自我想,我不能在说了,呵呵。为了安全起见,我这里的鉴权一点没说,望理解。此外,quartz的基础表是肯定要建的。

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章