xxljob 分布式任务调度平台。
xxljob 的介绍以及简单配置这里不多说,可以直接搜索GIT上的源码以及文档进行查阅。
这里主要是说一下自己填过的坑。
项目构成:
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器(我这里以springboot项目为例)
调度中心配置文件:
图片是直接copy下来的,这里主要的点是数据库的配置 其他的默认即可。数据库名字是项目重的sql文件中定义的,当然可以自己更改。
调度中心一般都没什么问题,大部分是可以正常配置的,启动的话建议两种方式。
1.独立测试的话可以springboot自带的启动类启动
2.开发项目建议将项目打成war/jar包部署到tomcat目录下webapp下,直接启动tomcat即可
这里简单说一下打成jar/war包的步骤:
准备工作:
1.规范打成war包名称:再pom.xml里添加
com.spotify
docker-maven-plugin
0.4.13
${project.artifactId}:${project.version}
${project.basedir}
/
${project.build.directory}
${project.build.finalName}.jar
xxl-job-admin
指定打成jar/还是war包,同样再pom.xml中配置:
war
2.用maven的命令打包 install (idea右侧的maven按钮下就有) 打成的war包一般存放在项目的target目录下,这里会有打成的war包,以及项目配置等
将下面选中的都copy后放入tomcat的webapp目录下,启动即可。这里包括xxl-job-admin 以及xxl-job-admin.war
此时,调度中心就已经配置成功,如上所述均配置正确,启动也应该没问题,如有问题请留言,一起探讨。
2.xxl-job-core:这个提供的只是依赖,项目中用到的也只是在pom.xml中引入依赖,还没有仔细看,这里先不做解释。
3.xxl-job-executor:执行器
大部分问题都是出在这里的
首先:配置文件
当 调度中心admin是通过tomcat启动(即使springboot方式启动,端口也会占用8080,内嵌tomcat的缘故)成功,执行器中的端口号不能与tomcat的端口号相同,如图,我的改成8082.
调度中心地址:当调度中心启动成功后,页面的路径是什么,这里就填入什么,例如:访问调度中心的地址是:http://localhost:8080/xxl-job-admin 那么这里的地址同样也是:http://localhost:8080/xxl-job-admin
接下来是执行器的配置
appname 要与项目名称一致,这里的项目是指执行器项目例如:xxl-job-executor,ip可以不填(这里对应控制器中 执行器选项的 自动注册,手动注册)端口号是jetty的端口号,默认是9999 可以修改,根据具体个人情况是否修改。
如下:
# web port server.port=8082 # log config logging.config=classpath:logback.xml ### 执行器配置 ### xxl-job admin address 地址必须与调度中心访问地址保持一致 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address ,执行器appname 也就是项目名称 xxl.job.executor.appname=xxl-job-executor ### ip port 默认即可 xxl.job.executor.ip= xxl.job.executor.port=9999 ### xxl-job, access token xxl.job.accessToken= ### xxl-job log path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job log retention days xxl.job.executor.logretentiondays=-1
接下来先创建config配置中心:
package com.xxl.job.executor.core.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * 作用:配置中心,说的白话一点,就是将调度中心与执行器关联 ,有兴趣的同学可以看一下源码的:xxlJobExecutor方法 * * @author xuxueli 2017-04-28 */ @Configuration @ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")//这里是handler所在包的地址 public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @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(initMethod = "start", destroyMethod = "destroy") public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppName(appName); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
创建handler:
package com.xxl.job.executor.service.jobhandler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; /** * 任务Handler示例(Bean模式) * * 开发步骤: * 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; * 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例; * 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。这里说的是下图①的地方 * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; * * @author xuxueli 2015-12-19 19:43:36 */ @JobHandler(value="demoJobHandler") @Component public class DemoJobHandler extends IJobHandler { @Override public ReturnTexecute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World."); for (int i = 0; i < 5; i++) { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } return SUCCESS; } } 配置成功后,可以启动执行器(执行器启动的时候是用springboot启动类启动的)如启动失败可以下方留言。
最后在可视化界面中先添加执行器,后添加定时任务。
1.添加执行器时选择自动注册时,建议将本地的ip地址填入执行器的配置文件中的xxl.job.executor.ip地方(在添加执行器前填入效果更好)
2.添加定时任务时主要点时handler要保持与代码中的相同即可 ①
3.项目一般采用的bean模式,这个不固定,根据不同的情况选择不同的模式
接下测试即可。
罗列一下我自己走过的坑:
1.将admin调度中心打成war包放入tomcat下运行,报错各种错误
-------------解决方法:xxl-job-admin 与 xxl-job-admin.war 一同放到webapp目录下
2.添加执行器选择自动注册时一直注册不上
-------------解决方法:xxl.job.executor.ip这个填入本机的ip地址(之前填的时127.0.0.1,注册的时候注册不进去)
3.job handler nof found
-------------解决方法:一般时handler书写错误,仔细核对,然后执行器是用springboot启动,(我出这个错误的时候我的项目都没有问题,最后也不知道怎么的就好了,现在正在思考这个问题)
文档有待补充优化,这几天会再优化一版,想探讨的留言即可,我也是刚接触这个!