IllegalArgumentException в ByteBuffer при отправке веб-сокета - PullRequest
0 голосов
/ 15 июня 2019

У меня довольно сложное приложение на основе веб-сокета, работающее на современном сервере Tomcat 8.

Через довольно случайные интервалы я получаю это исключение, одновременно для всех подключенных пользователей.

java.lang.IllegalArgumentException
at java.nio.Buffer.limit(Buffer.java:275)
at org.apache.tomcat.websocket.PerMessageDeflate.sendMessagePart(PerMessageDeflate.java:377)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:284)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:258)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialBytes(WsRemoteEndpointImplBase.java:161)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendBinary(WsRemoteEndpointBasic.java:56)
at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendBinaryMessage(StandardWebSocketSession.java:202)
at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:105)
at org.infpls.royale.server.game.session.RoyaleSession.sendImmiediate(RoyaleSession.java:69)
at org.infpls.royale.server.game.session.SessionThread.run(SessionThread.java:46)

После создания этого исключения веб-сокет остается в состоянии PARTIAL_WRITING и отключается при следующей попытке записи.

Я видел, как это произошло через 15 минут после запуска Tomcat, и я видел, как это произошло после простоя на сервере в течение 8 часов. Я не могу найти никакой связи с тем, что пользователи делают на сервере, и когда выдается это исключение.

Проблема, кажется, происходит довольно глубоко в Spring / Java NIO-коде, и я не уверен, как это отладить.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 16 июня 2019

Я сделал снимок в темноте после того, как прочитал некоторые слегка связанные с этим проблемы от других людей, и вместо того, чтобы передавать байтовый буфер потокам клиента для его отправки, я сделал полные копии байтового буфера для каждого потока, который его отправит.

Я также переключился с использования websocket.sendBinary (ByteBuffer bb) на использование вместо него websocket.sendBinary (byte [] bb).

Это, похоже, сработало, поскольку я не видел, чтобы эта ошибка повторялась при работе сервера в производственном режиме с довольно большой нагрузкой в ​​течение 12 часов. Если я найду дополнительную информацию об этом, я обновлю ее здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...