Client-error:unknown code for readObject at 0x32(2) 问题的处理

没错,这里是在使用 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
复制代码

调度中心项目配置,检查配置没什么问题,调度中心正常运行,可以访问使用,可以配置执行器触发执行器的调用执行动作。调度中心根据执行器配置新增本地测试执行器。

Client-error:unknown code for readObject at 0x32(2) 问题的处理

执行器项目配置,检查配置调度中心地址,本地调用,直接访问 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,这就占用了。。。

Client-error:unknown code for readObject at 0x32(2) 问题的处理

问题解决

事实上问题是这么解决的,是我孤陋寡闻了,不知 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;再次启动执行器项目,控制台打印日志无异常。调度中心再次使用该执行器执行定时任务,正常执行,无异常出现。

Client-error:unknown code for readObject at 0x32(2) 问题的处理

Power By niaonao, The End

原文 

https://juejin.im/post/5e81684ff265da47d537b656

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Client-error:unknown code for readObject at 0x32(2) 问题的处理

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址