XXL-JOB 是一个优秀的分布式任务调度平台,广泛应用于企业级任务调度场景。它具有轻量级、易扩展、高可靠等特点,支持多种任务调度模式。
在考虑将执行使用docker方式部署时,遇到一个问题。执行器可以成功注册,但是调度时会报错msg:xxl-job remoting error(Connection refused (Connection refused))。
从注册地址可以发现,地址并非执行器所在机器的地址,而是docker网卡的地址,所以调度器访问肯定是访问不通的。
在原始代码的config中可以发现,作者写了容器或多网卡配置config的具体操作:
/**
* 针对多网卡、容器内部署等情况,可借助 "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();
*/
经过尝试,发现还是不能成功调度。(可能是我的方式不对,有使用这种方式成功部署的,可以分享一下自己的经验,多谢!)
我们想要成功调度,无疑是需要调度器能访问到执行器。按照这个思路,我们可以将容器内执行器的port暴露出来,可以通过宿主机的IP+端口访问到执行器。
xxl:
job:
admin:
addresses: http://xxxx.xxxx.xxxx.xxxx:31002/xxl-job-admin
accessToken: default_token
executor:
ip:
appname: app_name
address:
port: 10001
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: 30
docker镜像的制作这里就不在赘述了,上面的配置文件中我们给执行器的端口是10001,因此我们的容器的启动脚本应该是:
docker run -it -d -p 10003:10001 --name app_name --restart=unless-stopped app_iamges:1.0
成功启动容器后,我们需要在调度界面创建一个执行器,注册方式为手动录入。注册地址为:http://宿主机IP:10003,即可成功调度。