龙空技术网

分布式任务调度平台 xxl-job

书阙传香 207

前言:

现时同学们对“init源码”可能比较重视,咱们都想要知道一些“init源码”的相关文章。那么小编同时在网络上搜集了一些对于“init源码””的相关文章,希望小伙伴们能喜欢,姐妹们快快来了解一下吧!

在业务中,我们经常会需要定时去执行一些特定的任务,比如每天凌晨,要把昨天的数据进行统计,诸如此类,这就是我们所说的任务调度。

在java项目中,我们之前一般用得比较多的是quartz,还有spring自己的schedule,相比而言quartz支持的api更多,但是在分布式场景中,都会面临job被重复执行的问题。

当然,如果就要这么用的话,我们可以通过分布式锁,或者,单节点部署job然后,调用服务的方式去避免job的重复执行。

那么,有没有其他天然支持的方案呢?这里,我们介绍下xxl-job,官方的介绍是分布式任务调度平台。这个就有点类似我们微服务的注册中心,各个节点把调度任务注册到管理平台,任务在管理系统这边统一调度,执行的时候,选择一个节点去执行就可以了,不会引起多个节点同时执行的情况。

下面我们来体验下xxl-job

1.从github下载源码

这里我们主要需要的是xxl-job-admin,这是调度平台的管理端。

2.导入sql

源码下的doc/db 下的sql文件是xxl-job-admin的建表sql

数据执行之后

3.启动xxl-job-admin项目

修改xxl-job-admin的配置文件,主要是数据库信息,然后就可以启动项目

用户名:admin

密码:123456

进去之后会看到管理界面如下

4.写一个应用来执行调度任务

4.1 写配置文件类

@Data@SuperBuilder@AllArgsConstructor@NoArgsConstructor@ConfigurationProperties(prefix = "xxl.job")public class XxlJobProperties {    private String adminAddresses;    private String accessToken;    private Executor executor;    @Data    @SuperBuilder    @AllArgsConstructor    @NoArgsConstructor    public static class Executor{        private String appName;        private String address;        private String ip;        private int port;        private String logPath;        private int logRetentionDays;    }}

4.2配置bean

@Slf4j@RequiredArgsConstructor@Configuration@EnableConfigurationProperties(value = {        XxlJobProperties.class})public class XxlJobConfiguration {    private final XxlJobProperties xxlJobProperties;    @Bean    public XxlJobSpringExecutor xxlJobExecutor() {        log.info(">>>>>>>>>>> xxl-job config init.");        XxlJobProperties.Executor executor = xxlJobProperties.getExecutor();        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();        xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdminAddresses());        xxlJobSpringExecutor.setAppname(executor.getAppName());        xxlJobSpringExecutor.setAddress(executor.getAddress());        xxlJobSpringExecutor.setIp(executor.getIp());        xxlJobSpringExecutor.setPort(executor.getPort());        xxlJobSpringExecutor.setAccessToken(xxlJobProperties.getAccessToken());        xxlJobSpringExecutor.setLogPath(executor.getLogPath());        xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays());        return xxlJobSpringExecutor;    }}

4.3 写个job用来测试

@Slf4j@Componentpublic class XxlSchedule {    @XxlJob("demoJobHandler")    public void demoJobHandler() throws Exception {        XxlJobHelper.log("XXL-JOB, Hello World.");        log.info("XXL-JOB, Hello World.");        for (int i = 0; i < 5; i++) {            XxlJobHelper.log("beat at:" + i);            log.info("beat at:" + i);            TimeUnit.SECONDS.sleep(2);        }        // default success    }}

4.4 配置文件

# web portserver.port=8081# no web#spring.main.web-environment=false# log config#logging.config=classpath:logback.xml### xxl-job admin address list, such as "; or ";xxl.job.admin-addresses= xxl-job, access tokenxxl.job.accessToken=### xxl-job executor appnamexxl.job.executor.app-name=xxl-job-executor-sample### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is nullxxl.job.executor.address=### xxl-job executor server-infoxxl.job.executor.ip=xxl.job.executor.port=9999### xxl-job executor log-pathxxl.job.executor.logpath=/Users/bane/data/logs/jobhandler### xxl-job executor log-retention-daysxxl.job.executor.logretentiondays=30

4.4 启动服务,然后去admin界面看到,已经有了一个执行器 ,就是注册成功了

5.执行任务试试

5.1执行1次

控制台输入如下

5.2设置任务每秒执行

启动

可以看到任务在不断地被执行了

以上是xxl-job的demo执行,我们在实际业务中根据自己的情况进行调整即可。

另外的话还有个powerjob,看介绍好像更厉害一点,不过ui还没有,后续有机会也来调研下。

标签: #init源码