1.9.2版本用的是 war 必须要tomcat启动。 2.3.0 的是jar包。可以直接用java启动
xxl-job文档地址 分布式任务调度平台XXL-JOB (xuxueli.com)
一、初识xxl-job
我自己的理解,是我们自己写的逻辑代码,需要定期的去执行,然后在这个背景下,我们会使用到我们的任务调度,在此我使用的是xxl-job任务调度。
二、概述
xxl-job是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
三、下载
源码仓库地址(一个是githup,另外一个是码云,任何一个下载都行)
源码仓库地址 Release Download
xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) (github.com)
四、操作步骤 2.3.0 只有8张表 1.9.2 是16张表
1.先在我们的本地数据库建立8张表,如果未建表,程序启动会报错,具体的建表语句是在我们项目这个位置:
/xxl-job/doc/db/tables_xxl_job.sql,然后执行sql脚本就行了,会在库中生成8张表。
表如下:
2.修改xxl-job项目下的application.properties文件中的一些基本信息:
2.1.换成自己的数据库
2.2.换成自己的邮箱以及密码(根据他官网这么修改的)
五、启动调度中心项目(xxl-job-admin)
如果已经正确进行上述配置,可将项目编译打包部署。 调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址),登录后运行界面如
六、 配置执行器项目(xxl-job-executor-sample-spring这个项目)
1.作用:负责接收"调度中心"的调度并执行,可直接部署执行器,也可以将执行器集成到现有业务项目中。
2.maven依赖
确认pom文件中引入了 "xxl-job-core" 的maven依赖;
3.执行器配置
执行器配置,配置文件地址:
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin admin的地址
xxl.job.executor.appname=xxl-job-executor-sample 执行器的名称
xxl.job.executor.port=9999 执行器的端口
xxl-job-executor-samples\xxl-job-executor-sample-springboot 下面有一个配置文件
执行器配置,配置内容说明:
### xxl-job admin address list:调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job executor address:执行器"AppName"和地址信息配置:AppName执行器心跳注册分组依据;地址信息用于"调度中心请求并触发任务"和"执行器注册"。执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用。单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.port=9999
### xxl-job, access token:执行器通讯TOKEN,非空时启用
xxl.job.accessToken=
### xxl-job log path:执行器运行日志文件存储的磁盘位置,需要对该路径拥有读写权限
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
### xxl-job log retention days:执行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保持3天,否则功能不生效;
xxl.job.executor.logretentiondays=-1
七:1、本地项目引入 pom文件
<!--xxl-job-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
2、application.properties
配置这三项就行,
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin admin的地址
xxl.job.executor.appname=xxl-job-executor-sample 执行器的名称
xxl.job.executor.port=9999 执行器的端口
下面的作为参考, 可以直接上官网看
#spring.main.web-environment=false
# log config
logging.config=classpath:logback.xml
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
3、配置执行器
package com.scm.platform.entrance.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.Getter;
import lombok.Setter;
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.Configuration;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
@Getter
@Setter
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
private String address;
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
private String logPath;
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info("xxl-job 2.3.0 >>>>>>>>>>> xxl-job config init....");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
4、新建测试类
@Slf4j
@Component
public class EntranceJobHandler {
@XxlJob("demoJobHandler")
public void demoJobHandler(String s) throws Exception {
log.info(s);
log.info("2.3.0---> xxl-job------->");
// default success
}
}
心得:如果是新搭建的框架的话,应该很快就可以成功了,参照我这个和官网,我个人搭建框架是遇到过几个坑的,框架以前用的是1.9.2的版本,遇到各种问题,下面是几个坑
1、xxl-job 每隔几秒报错 No classes defined at reference '62' 64 等应该都是admin和execute执行器版本不一致导致的
2021-07-07 19:38:05.179 ERROR [sf-trading-server,,,] 27328 --- [p1291149645-509] c.x.j.c.r.n.j.server.JettyServerHandler : No classes defined at reference '62'
java.lang.IllegalStateException: No classes defined at reference '62'
at com.xxl.job.core.rpc.serialize.HessianSerializer.deserialize(HessianSerializer.java:47)
at com.xxl.job.core.rpc.netcom.jetty.server.JettyServerHandler.doInvoke(JettyServerHandler.java:54)
at com.xxl.job.core.rpc.netcom.jetty.server.JettyServerHandler.handle(JettyServerHandler.java:30)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:500)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.caucho.hessian.io.HessianProtocolException: No classes defined at reference '62'
at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2943)
at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2135)
at com.caucho.hessian.io.CollectionDeserializer.readLengthList(CollectionDeserializer.java:93)
at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2105)
at com.xxl.job.core.rpc.serialize.HessianSerializer.deserialize(HessianSerializer.java:44)
... 20 common frames omitted
2、xxl-job配置报错
address:192.168.0.117:19998 code:500 msg:xxl-rpc remoting error(no protocol: 192.168.0.117:19998/run), for url : 192.168.0.117:19998/run
no protocol :没有协议,在节点环境查看 http://192.168.0.117:19998/ 是否有http协议
配置执行器的时候记得带http://