xxl-job这玩意一般都和elastic job比较,区别就不多说了,玩这个最主要看中文档齐全,版本一直更新,社区活跃。
http://www.xuxueli.com/xxl-job
首先去官网下载代码,其余就不多说了,因为许雪里大佬的文档写的已经介绍的非常不错了。
<!--xxl调度器使用--> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.0.2</version> </dependency>
1、首先执行数据库脚本,这是基于mysql的,就不用多说了,执行完脚本将xxl-job-admin的配置文件数据库连接修改成你的数据库即可。
2、把你的xxl-job-admin运行起来,然后在浏览器浏览页面。
http://localhost:8080/xxl-job-admin
3、开始搞你的执行器,需要先继承IJobHandler,然后重写execute方法,我还是直接贴代码吧。
@Component @JobHandler(value = "pushdata") public class PushDataTask extends IJobHandler { @Override public ReturnT<String> execute(String param) throws Exception { System.out.println("执行完成" + param); return SUCCESS; } }
4、一定注意添加配置文件,配置文件内容如下。
xxl: job: admin: addresses: http://192.168.1.1:8080/xxl-job-admin executor: appname: push-data ip: port: 9999 logpath: /data/applogs/xxl-job/jobhandler logretentiondays: -1 accessToken:
5、这样你以为完了?那你就真完了,运行的时候会报错,错误信息:
xxl-job trigger error, please check if the executor[192.168.1.1:9999] is running.
what???执行器明明启动了为毛运行报错???因为你少的配置项,也就是需要一个配置类。上代码就明白了。
@Configuration 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(initMethod = "start", destroyMethod = "destroy") public XxlJobSpringExecutor xxlJobExecutor() { 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; } }
然后完事了。admin调度中心先添加一个执行器,然后在添加一个任务调度器即可,其余内容没啥好介绍的。
做集群处理的时候,在添加执行器的地方,添加多个IP+端口即可,逗号隔开。
logpath:此配置项是存储执行器产生的日志,如果你调用xxl的日志记录器(如下)就会将日志记录在一个日志中,每运行一次都会产生一个文件。
XxlJobLogger.log("写一个日志测试");
踩坑:
1、下载下来代码死活跑不起来说丢失包,出现这问题毫无疑问是引用包问题,代码是没问题,找到你本地maven仓库删掉,然后重新下载。
2、就上上面错误,说执行器运行不起来,其实是丢失配置信息。
好了面试受打击了,来写下源码及原理:
1、在客户端程序创建一个执行器,为什么需要一个单独的端口呢?因为xxl自己启动了一个jetty服务器。
2、然后注册到xxl管理平台,然后xxl管理平台在任务执行时间到的时候,触发调用执行器。
3、执行器通过反射机制调用execute方法来实现。