说实话作为一个Java的小白,看到报错真的很烦恼,但是解决了问题真的很爽,下面是我在spring框架中使用websocket中一直陪伴我的一个错误(其实是一堆0.0),话不多说上报错~.~;
第一个报错如下:
java.lang.IllegalAccessError: tried to access method org.apache.tomcat.util.net.SocketWrapperBase.getEndpoint()Lorg/apache/tomcat/util/net/AbstractEndpoint; from class org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.clearHandler(WsRemoteEndpointImplServer.java:225) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.onWritePossible(WsRemoteEndpointImplServer.java:131) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:75) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:494) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:381) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$TextMessageSendHandler.write(WsRemoteEndpointImplBase.java:803) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendStringByCompletion(WsRemoteEndpointImplBase.java:212) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendStringByFuture(WsRemoteEndpointImplBase.java:197) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.WsRemoteEndpointAsync.sendText(WsRemoteEndpointAsync.java:53) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at com.example.test.Controllor.WebSocketController.openHeartbeat(WebSocketController.java:85) ~[classes/:na]
at com.example.test.Controllor.WebSocketController.onOpen(WebSocketController.java:46) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_261]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_261]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_261]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_261]
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:65) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:64) [tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:133) [tomcat-embed-websocket-8.5.23.jar:8.5.23]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:934) [tomcat-embed-core-9.0.71.jar:9.0.71]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) [tomcat-embed-core-9.0.71.jar:9.0.71]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.71.jar:9.0.71]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.71.jar:9.0.71]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.71.jar:9.0.71]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.71.jar:9.0.71]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_261]
这个错误是我最先见到的一个报错,既然是第一个出现的,我以为它必然是重量级的错误,结果不然,刚开始我看到这么长的报错我很慌,我第一时间想的就不是看仔细阅读一遍报错,而是复制粘贴去网上收解决方法,找了好几天也没什么实质性进展,反而报错越来越多样化,丰富了我的bug多样性。。。。。
最后我实在办法了,我才去整体的读了一遍虽然不是完全懂(英语不咋地),但是我也读出了些许端倪,
org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:65) ~[tomcat-embed-websocket-8.5.23.jar:8.5.23]
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.71.jar:9.0.71]
我看到8.5.23和9.0.71我的DNA懂了想到了被版本冲突支配的恐惧,我马上去网上查tomcat和websocket版本不一致会不会出错,结果果不其然没找到相关文章,所以又浪费了半个小时。 所以我选择实践我把我pom.xml中的
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>8.5.23</version>
</dependency>
就是上面这个换成了9.0.71版本的websocket再次运行发现没问题了不报错了,第一次体验到了实践先于理论的感觉。
这是没改前的:(一旦有人连接就报错并且还客服端直接无法断开连接)
改后:(直接正常了可以正常的连接,断开发消息也不会报错)
第二个报错:就是每六十秒一个大大的ERROR报错(直接一整个讨厌红色了):
但是在我解决上一个问题后我发现这个问题也没了,直接爽到爆!!!!!
第三个报错是连接后2分钟后报个错就断开连接了(如下)
这个问题也好解决,在客服端加一个心跳(也就是每隔几十秒给服务端发一条心跳消息,告诉服务器客服端还在线,不要把session断开,毕竟session存在是有时效的,到了时间就没了,我的就是2分钟的时效到了点马上断开报错,就像我下课吃饭绝不拖延一秒一样)
这是我的心跳代码
private void webSocketHeartbeat() {
new Thread(() -> {
while(true){
try {
if(webSocketClient == null||!webSocketClient.isOpen()){
break;
}
Thread.sleep(100*1000);//100秒发一次心跳,告诉服务器我还活着
} catch (Exception e) {
Log.e("Heartbeat","心跳错误");
}
webSocketClient.send(webSocketHeartbeatStr);
}
}).start();
}
//在onOpen中调用这个方法
结论:
好了现在我们得到了一个结论:是websocket和tomcat版本不同步导致报错
我估摸着是老版本删除了某些东西导致的具体不知道(有懂得给我也讲讲呗(坏笑))
以上就是我遇到的问题和自己的解决方案,如果有不妥的地方希望能评论区指出,如果你也遇到了同样的问题,并且通过我的方法解决了也不要太高兴,记住我们不但要学会copy别人,也要学会自己找错和解决错误