最近工作的时候使用xxl-job组件做定时任务,碰到了一个异常,在网上查没有查到相关结果,后来自己解决了,记录下来以供后续有类似异常的人作为修复参考.
异常信息截图如下:
异常抛出的机制是,启动项目抛出一次,后续每间隔几秒钟抛出一次,十分频繁
可以看出,提示信息是json转化异常,期望得到的值与实际值不匹配
这个提示是有一些误导的,实际上的情况可能和这个报错有出入
我个人根据报错机制,猜测是xxl-job访问连接异常,每隔几秒一次心跳检测报错.
后来的发现印证了我的猜测,xxl-job会每隔一段时间自动访问配置文件中你配置的adress,如果该地址不能被访问到(内外网不互通/映射等原因),就会得到一个访问error页面,导致xxl-job收到的信息是该页面的错误信息,从而不能正确解析.
通过tcping工具测试xxl-job的地址,发现地址是通的,也就是项目adress配置不对,再结合修改配置文件调试,证实确实是该原因导致.
排雷如下:
在xxl-job的实际工作中,我们在xxl-job的web页面应当采手动配置映射器的adress.
需要注意,当采用手动配置执行器,项目配置文件的地址是xxl-job访问的地址,访问地址并不需要和web页面的xxl-job执行器地址保持一致,只需要执行器AppName配置一致即可
但是问题来了,每次项目部署上,内网地址是随机分配的,adress不能写死,那应该如何配置呢?
这里用到了ip中的特殊占位ip:0.0.0.0
解释一下
首先,0.0.0.0
是不能被ping
通的。0.0.0.0称为“unspecified”,即未指定(即无效的,无意义的)地址。从功能上看,一般用于某些程序/网络协议中不便使用具体ip的特殊情况(说白了就是一个用于某些比较坑的情况的“占位符”),比如DHCP客户端还未获取到ip的时候规定使用0.0.0.0作“源地址”,或者在服务器中,0.0.0.0
并不是一个真实的的IP地址,它表示本机中所有的IPV4地址。服务器不指定在哪个网卡上监听时,也使用0.0.0.0,这个时候监听本机中所有IP的端口。可以用作服务端,表示本机真实的网络IP地址。
也就是项目配置adress应该为0.0.0.0,让他自己去获取网络正式地址.而xxl-job的web页面执行器配置外网调度地址即可.
最后实测,完美解决问题.