Я использую реализацию сервера Spring WebSocket для одного из моих проектов на основе Spring. Я столкнулся с ошибкой The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is invalid state
. Я обнаружил, что проблема заключается в одновременной записи в веб-сокет из разных потоков.
Как я это временно исправил: считайте, что я реализовал метод ниже
void sendMessageToSession(WebsocketSession session,String message);
который отправляет TextMessage в сеанс веб-сокета. Я не могу синхронизировать весь этот метод, потому что несколько потоков могут вызывать его для разных сеансов websocketSessions и сообщений. Я также не могу поместить сеанс в синхронизированный блок (пробовал и не работал)
Хотя я исправил свою проблему вот так
synchronized(session.getId()){
//sending message;
}
и я больше не сталкивался с этой проблемой. Но использование строк в синхронизированных блоках не является хорошей практикой. Итак, какие еще решения у меня есть? как лучше всего отправлять асинхронные сообщения?
PS: я уже использовал ConcurrentWebSocketSessionDecorator
после установления соединения и использую обновленный веб-сокет. не помогло.
session = new ConcurrentWebSocketSessionDecorator(session, (int) StaticConfig.MAXIMUM_WS_ASYNC_SEND_TIMEOUT, StaticConfig.MAXIMUM_WS_BINARY_BUFFER_SIZE * 2);
ПРИМЕЧАНИЕ. Я сохраняю сеансы websocet на карте, где ключ - session.getId, а значение - сам сеанс.
В отличие от некоторых других реализаций веб-сокетов, ссылки на веб-сокеты Spring не кажутся равными для каждого сообщения. Я сохранял сеансы на карте по их идентификатору, и в каждом сообщении я проверяю равенство переданного веб-сокета с веб-сокетом, который я уже поместил на свою карту, его ложь.
synchronized(session.getId())
не может решить вашу проблему .. - person xingbin   schedule 04.02.2018