0

WebSocket を使用するアプリケーションに Tomcat 7.0.42 を使用しています。アプリケーションの負荷が高い場合、websocket を使用する一部のスレッドでデッドロックが発生します。

修正が見つからなかったので、この問題の回避策はありますか?

Atmpshere 2.0RC3 ランタイム ネイティブを使用します。

これが私のスレッドダンプの関連部分です。Samurai を使用して、デッドロックされたスレッドを検出しました。

     "Atmosphere-Shared-AsyncOp-267"   daemon prio=10 tid=0x00007efed8118000 nid=0x2eb5 waiting for monitor entry [0x00007efe798ca000]      java.lang.Thread.State: BLOCKED (on object monitor)      at org.apache.catalina.websocket.WsOutbound.writeTextMessage(WsOutbound.java:165)      - waiting to lock <0x00000005ef4c6988> (a org.apache.catalina.websocket.WsOutbound)      
at org.atmosphere.container.version.TomcatWebSocket.write(TomcatWebSocket.java:49)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:199)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:168)   
   at org.atmosphere.websocket.WebSocket.write(WebSocket.java:40)     
 at org.atmosphere.cpr.AtmosphereResponse$2.write(AtmosphereResponse.java:574)      
at org.atmosphere.handler.AbstractReflectorAtmosphereHandler.onStateChange(AbstractReflectorAtmosphereHandler.java:169)      
at org.atmosphere.cpr.DefaultBroadcaster.invokeOnStateChange(DefaultBroadcaster.java:1027)   
   at org.atmosphere.cpr.DefaultBroadcaster.prepareInvokeOnStateChange(DefaultBroadcaster.java:1047)    
  at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:921)     
 at org.atmosphere.cpr.DefaultBroadcaster$3.run(DefaultBroadcaster.java:580)      - locked <
    0x00000005ef4b77f8> (a org.atmosphere.cpr.AtmosphereResourceImpl)     
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)  
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)   
   at java.util.concurrent.FutureTask.run(FutureTask.java:166)    
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)     
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)    
  at java.lang.Thread.run(Thread.java:724)  


    "Atmosphere-Scheduler-2"   daemon prio=10 tid=0x00007efee9c77800 nid=0x257d waiting for monitor entry [0x00007efe831ef000]      java.lang.Thread.State: BLOCKED (on object monitor)      
at org.atmosphere.cpr.AsynchronousProcessor.completeLifecycle(AsynchronousProcessor.java:476)      - waiting to lock <0x00000005ef4b77f8> (a org.atmosphere.cpr.AtmosphereResourceImpl)     
 at org.atmosphere.cpr.AsynchronousProcessor.timedout(AsynchronousProcessor.java:437)      
at org.atmosphere.cpr.AsynchronousProcessor$AsynchronousProcessorHook.timedOut(AsynchronousProcessor.java:633)     
 at org.atmosphere.websocket.DefaultWebSocketProcessor.close(DefaultWebSocketProcessor.java:483)      
at org.atmosphere.container.TomcatWebSocketHandler.onClose(TomcatWebSocketHandler.java:80)      
at org.apache.catalina.websocket.StreamInbound.doOnClose(StreamInbound.java:222)      
at org.apache.catalina.websocket.WsOutbound.doWriteBytes(WsOutbound.java:423)      
at org.apache.catalina.websocket.WsOutbound.doWriteText(WsOutbound.java:442)      
at org.apache.catalina.websocket.WsOutbound.writeTextMessage(WsOutbound.java:174)      - locked <
    0x00000005ef4c6988> (a org.apache.catalina.websocket.WsOutbound)      
at org.atmosphere.container.version.TomcatWebSocket.write(TomcatWebSocket.java:49)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:199)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:168)      
at org.atmosphere.websocket.WebSocket.write(WebSocket.java:40)      
at org.atmosphere.cpr.AtmosphereResponse$2.write(AtmosphereResponse.java:574)      
at org.atmosphere.cpr.AtmosphereResponse.write(AtmosphereResponse.java:992)      
at org.atmosphere.interceptor.HeartbeatInterceptor$1$1.call(HeartbeatInterceptor.java:104)      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)      
at java.util.concurrent.FutureTask.run(FutureTask.java:166)      
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)     
 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)     
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)     
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)  
    at java.lang.Thread.run(Thread.java:724)
4

1 に答える 1

0

トムキャットのバグ!!! Tomcat を最新バージョンに更新するか、次のように構成する必要があります。

web.xml に追加します。

  <init-param>
      <param-name>org.atmosphere.cpr.Broadcaster.writeTimeout</param-name>
      <param-value>VALUE</param-value>
  </init-param>

値はミリ秒単位で、20000 ~ 30000 をお勧めします。

于 2018-03-21T12:23:38.210 に答える