框架建设实战7——定时任务组件

41 阅读1分钟

在金融系统中,或者其他对账系统里,往往离不开分布式定时任务。用来做查证或者重试处理。

分布式job目前一般有如下三种:

1.elastic job

当当出品,比较老牌。新公司用的应该不多了。

2.xxl-job

个人开源项目。便于二开;有简洁的后管配置界面,方便接入。

3.powerjob

功能相对全面,至少比xxl-job多了任务编排之类的功能。其基于时间轮的调度模式,还是挺不错的。

我们以xxl-job为例,搭建对应的job组件 : frame-job-starter

1.pom依赖:

   <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter</artifactId>  
      <scope>provided</scope> 
    </dependency>  
    <dependency> 
      <groupId>com.xuxueli</groupId>  
      <artifactId>xxl-job-core</artifactId> 
    </dependency>   
    <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency>  

2.核心配置类:

@Slf4j
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.executor.appname:}")
    private String appName;

    @Value("${xxl.job.executor.ip:}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.accessToken:}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobExecutor = new XxlJobSpringExecutor();
        xxlJobExecutor.setAdminAddresses(adminAddresses);
        xxlJobExecutor.setAppName(appName);
        xxlJobExecutor.setIp(ip);
        xxlJobExecutor.setPort(port);
        xxlJobExecutor.setAccessToken(accessToken);
        xxlJobExecutor.setLogPath(logPath);
        xxlJobExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobExecutor;
    }
}

3.Enable注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(XxlJobConfig.class)
public @interface EnableJob {

}

最后,提醒大家,定时任务的设计一定是无状态的。

当然,也有公司因为业务场景的复杂度,自研对应的任务调度系统。好比大数据领域中资源调度框架yarn一样。

比如,笔者曾经主导的自研外呼平台里,由于现有的分布式调度框架不满足,就需要自行搭建对应的分布式任务调度系统。