Java OkHttp4.2.9 连接两次同一个ws就会抛出拒绝策略

第一次连接client.newWebsocket("ws://whttp://www.xx.com%22/) 没有任何问题。但是关闭close后再去连接就报错


```java
java.io.InterruptedIOException: executor rejected
    at okhttp3.internal.connection.RealCall$AsyncCall.executeOn(RealCall.kt:501) ~[okhttp-4.9.2.jar:na]
    at okhttp3.Dispatcher.promoteAndExecute(Dispatcher.kt:184) [okhttp-4.9.2.jar:na]
    at okhttp3.Dispatcher.enqueue$okhttp(Dispatcher.kt:125) [okhttp-4.9.2.jar:na]
    at okhttp3.internal.connection.RealCall.enqueue(RealCall.kt:164) [okhttp-4.9.2.jar:na]
    at okhttp3.internal.ws.RealWebSocket.connect(RealWebSocket.kt:165) [okhttp-4.9.2.jar:na]
    at okhttp3.OkHttpClient.newWebSocket(OkHttpClient.kt:281) [okhttp-4.9.2.jar:na]
    at com.hengyi.client.utils.WebSocketConnection.connect(WebSocketConnection.java:49) [classes/:na]
    at com.hengyi.client.impl.WebsocketClientImpl.createConnection(WebsocketClientImpl.java:715) [classes/:na]
    at com.hengyi.client.impl.WebsocketClientImpl.symbolTicker(WebsocketClientImpl.java:320) [classes/:na]
    at com.hengyi.client.impl.WebsocketClientImpl.symbolTicker(WebsocketClientImpl.java:303) [classes/:na]
    at com.hengyi.tradesystem.manager.WebSocketConnectionManager.addCoin(WebSocketConnectionManager.java:117) [classes/:na]
    at com.hengyi.tradesystem.controller.WorkerController.addCoin(WorkerController.java:38) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_321]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_321]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_321]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_321]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) [tomcat-embed-core-9.0.39.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [tomcat-embed-core-9.0.39.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_321]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_321]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.39.jar:9.0.39]
    at java.lang.Thread.run(Thread.java:750) [na:1.8.0_321]
Caused by: java.util.concurrent.RejectedExecutionException: Task okhttp3.internal.connection.RealCall$AsyncCall@3dc2b3ef rejected from java.util.concurrent.ThreadPoolExecutor@50b7affb[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 3]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063) ~[na:1.8.0_321]
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830) [na:1.8.0_321]
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379) [na:1.8.0_321]
    at okhttp3.internal.connection.RealCall$AsyncCall.executeOn(RealCall.kt:498) ~[okhttp-4.9.2.jar:na]
    ... 62 common frames omitted

```

client.close之后,把client赋值为null,再次newWbeSocket的时候,再去初始化client。

根据你的描述,你使用 OkHttp 4.2.9 时尝试连接 WebSocket,第一次连接没有问题,但是在关闭连接后再次连接时出现错误。错误是“java.io.InterruptedIOException: executor rejected”,这可能是因为你在调用 client.newWebSocket() 时没有正确关闭上一个 WebSocket 连接。你应该在关闭 WebSocket 连接后调用 client.dispatcher().executorService().shutdown() 来关闭 executorService。这样可以避免连接池中的线程被无限制地积累。

client.close之后,把client赋值为null,再次newWbeSocket的时候,再去初始化client。
根据你的描述,你使用 OkHttp 4.2.9 时尝试连接 WebSocket,第一次连接没有问题,但是在关闭连接后再次连接时出现错误。错误是“java.io.InterruptedIOException: executor rejected”,这可能是因为你在调用 client.newWebSocket() 时没有正确关闭上一个 WebSocket 连接。你应该在关闭 WebSocket 连接后调用 client.dispatcher().executorService().shutdown() 来关闭 executorService。这样可以避免连接池中的线程被无限制地积累。

该错误java.io.InterruptedIOException: executor rejected通常意味着,程序试图在已经关闭的OkHttpClient对象上执行操作。您可以在每次调用完close()方法后重新创建新的OkHttpClient实例,或者使用一个单例或全局变量来保存客户端实例,以便可以在需要时重复使用它。

在Java OkHttp4.2.9中,连接同一WebSocket两次会抛出“executor rejected”的异常。 问题可能是在执行异步调用时拒绝了执行程序,这可能是因为您同时发起了多个请求并达到了连接限制。解决方法是增加连接限制,例如使用线程池并增加最大线程数,或者通过管理WebSocket实例来确保同一时间只有一个WebSocket连接打开。

https://ask.csdn.net/questions/7886269

可能是因为在关闭WebSocket连接后,相关资源没有得到及时释放,导致无法重新连接。可以尝试在连接之前检查WebSocket对象是否已经被释放,如果没有释放,则先调用WebSocket.close()方法进行释放,再重新连接。

以下是一个简单的示例代码,演示了如何通过检查WebSocket对象的readyState属性来检测WebSocket是否已经被释放,并在必要时进行释放和重新连接:

var ws = null;

function connect() {
  if (ws != null && ws.readyState != WebSocket.CLOSED) {
    // 如果WebSocket对象未被释放,则先关闭WebSocket对象
    ws.close();
  }
  
  // 创建新的WebSocket对象并连接
  ws = new WebSocket("ws://www.xx.com/");
  
  // 在onopen、onmessage、onclose等事件处理函数中处理WebSocket的连接、数据接收和断开连接等操作
  ws.onopen = function() {
    console.log("WebSocket connected");
  };
  
  ws.onmessage = function(event) {
    console.log("Received data: " + event.data);
  };
  
  ws.onclose = function() {
    console.log("WebSocket disconnected");
  };
}

在以上示例代码中,connect()函数会首先检查WebSocket对象是否已经被释放,如果没有被释放,则先调用WebSocket.close()方法进行释放。接着,创建新的WebSocket对象并连接,并在相关事件处理函数中进行操作。

需要注意的是,WebSocket的行为和性能在不同浏览器和环境中可能会有所不同。如果以上方法不能解决您的问题,可以尝试参考浏览器的相关文档或使用第三方的WebSocket库。

我解决了。去掉了

client.dispatcher().executorService().shutdown() 

代码