没错,这里是在使用 XXL 分布式定时任务框架遇到的问题,网上对于该类问题的给出的解决方案大都是关于执行器配置调度中心项目地址有误,要修改配置 xxl.job.admin.addresses。我这里没用分布式,本地开发环境,开了一个执行器;检查确认执行器项目配置的调度中心地址无误。但是执行器项目启动时打印日志有个端口占用问题。
最初启动调度中心项目和执行器项目后,没在意执行器项目端口占用的问题;调度中心正常使用,配置好执行器就直接调用,执行器执行异常。 报错信息:
java.lang.IllegalStateException: unknown code for readObject at 0x32 (2) at com.xxl.job.core.rpc.serialize.HessianSerializer.deserialize(HessianSerializer.java:33) at com.xxl.job.core.rpc.netcom.jetty.client.JettyClient.send(JettyClient.java:37) at com.xxl.job.core.rpc.netcom.NetComClientProxy$1.invoke(NetComClientProxy.java:51) at com.sun.proxy.$Proxy31.run(Unknown Source) at com.xxl.job.admin.core.trigger.XxlJobTrigger.runExecutor(XxlJobTrigger.java:193) at com.xxl.job.admin.core.route.strategy.ExecutorRouteFirst.routeRun(ExecutorRouteFirst.java:26) at com.xxl.job.admin.core.trigger.XxlJobTrigger.trigger(XxlJobTrigger.java:162) at com.xxl.job.admin.core.jobbean.RemoteHttpJobBean.executeInternal(RemoteHttpJobBean.java:29) at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) Caused by: com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x32 (2) at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697) at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177) at com.xxl.job.core.rpc.serialize.HessianSerializer.deserialize(HessianSerializer.java:31) ... 10 more 复制代码
调度中心项目配置,检查配置没什么问题,调度中心正常运行,可以访问使用,可以配置执行器触发执行器的调用执行动作。调度中心根据执行器配置新增本地测试执行器。
执行器项目配置,检查配置调度中心地址,本地调用,直接访问 http://127.0.0.1:8080/ 是正确响应的;本身执行器的 appname/ip/port 也是调度中心和执行器保持一致即可;ip 不配置项目会默认取本机 IP 地址;检查后配置正确。才注意去看下端口占用的问题,
xxl.job.admin.addresses=http://127.0.0.1:8080/ xxl.job.executor.appname=smartcrm-executor xxl.job.executor.ip= xxl.job.executor.port=9999 xxl.job.executor.logpath=/mnt/applogs/xxl-job/jobhandler/ xxl.job.accessToken= 复制代码
启动执行器项目时控制台日志包含一个端口占用问题,经典操作了,Win + R 打开命令行窗口,查看项目端口 9999 占用进程,taskkill 杀死进程。
>C:/Users/Lenovo>netstat -ano|findStr "9999" TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 26248 >C:/Users/Lenovo>taskkill -t -f -im 26248 成功: 已终止 PID 26248 (属于 PID 11140 子进程)的进程。 复制代码
重新启动执行器项目,控制台无情输出 java.net.BindException: Address already in use: bind。口吐芬芳ing
[org.eclipse.jetty.util.component.AbstractLifeCycle.setFailed(AbstractLifeCycle.java:212)] FAILED ServerConnector@90f437{HTTP/1.1}{0.0.0.0:9999}: java.net.BindException: Address already in use: bind java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) ~[?:1.8.0_191] at sun.nio.ch.Net.bind(Net.java:433) ~[?:1.8.0_191] at sun.nio.ch.Net.bind(Net.java:425) ~[?:1.8.0_191] at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[?:1.8.0_191] at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) ~[?:1.8.0_191] at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:321) ~[jetty-server-9.2.22.v20170606.jar:9.2.22.v20170606] at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) ~[jetty-server-9.2.22.v20170606.jar:9.2.22.v20170606] at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) ~[jetty-server-9.2.22.v20170606.jar:9.2.22.v20170606] at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.22.v20170606.jar:9.2.22.v20170606] at org.eclipse.jetty.server.Server.doStart(Server.java:366) [jetty-server-9.2.22.v20170606.jar:9.2.22.v20170606] at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.22.v20170606.jar:9.2.22.v20170606] at com.xxl.job.core.rpc.netcom.jetty.server.JettyServer$1.run(JettyServer.java:46) [SmartJobCore-1.8.1-20191128.032008-1.jar:?] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191] 复制代码
问题排查到 Tomcat,执行器项目是 IDEA 配置的本地 Tomcat,执行器 Tomcat 配置如下。执行器项目配置文件中 xxl.job.executor.port=9999,此处 Tomcat 不能配置为 9999,这就占用了。。。
事实上问题是这么解决的,是我孤陋寡闻了,不知 XXL 执行器配置有这个问题要注意;
配置调度中心项目地址有误,要修改配置 xxl.job.admin.addresses 执行器端口配置 xxl.job.executor.port 和 Tomcat 的 HTTP port 不能冲突
xxl.job.executor.port=9999 ,HTTP port 修改为 9998;调度中心执行器配置仍然为127.0.0.1:9999;再次启动执行器项目,控制台打印日志无异常。调度中心再次使用该执行器执行定时任务,正常执行,无异常出现。
Power By niaonao, The End