在金融系统中,或者其他对账系统里,往往离不开分布式定时任务。用来做查证或者重试处理。
分布式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一样。
比如,笔者曾经主导的自研外呼平台里,由于现有的分布式调度框架不满足,就需要自行搭建对应的分布式任务调度系统。