0

я столкнулся следующее сообщение об ошибке при использовании пружинного WebSockets:Блокировка сообщений в ожидании 10000 для BLOCKING..using весной WebSockets

Используйте случай: на нашей стороне сервера кода у нас есть fucntionality для поиска значений в base..if данных значения отсутствуют в базе данных .. он попадет в сервлет и получит данные. Вторая часть, т. е. попадание сервлета и получение данных - это асинхронный вызов.

Таким образом, для одного запроса есть несколько вещей, которые мы должны искать в базе данных ..

Пример: В запросе мы получили некоторый параметр канала: 1 Этот канал отображается на несколько идентификаторов говорят 1 отображается к 1,2,3,4,5

в WebSocket когда приходит запрос на сервер я извлеку канал и получить все идентификаторы сопоставляются и запустить цикл по идентификаторам следующим образом:

for(int i=0;i<ids.length;i++) 
{ 

SomeObject databaseRespObj=callToDatabase(i); //SomeObject contains two fields value exists and string values 

if(!databaseRespObj.valuesExists) 
{ 
AsynchronouscallToServelt(i); 
//once response received it will send message immediately using session 
} 

} 

While выполнение вышеуказанного кода на стороне сервера, некоторые раз только я столкнулся с приведенной ниже ошибкой.

java.lang.IllegalStateException: Blocking message pending 10000 for BLOCKING 
     at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.lockMsg(WebSocketRemoteEndpoint.java:130) ~[websocket-common-9.3.8.v20160314.jar:9.3.8.v20160314] 
     at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.sendString(WebSocketRemoteEndpoint.java:379) ~[websocket-common-9.3.8.v20160314.jar:9.3.8.v20160314] 
     at org.springframework.web.socket.adapter.jetty.JettyWebSocketSession.sendTextMessage(JettyWebSocketSession.java:188) ~[spring-websocket-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
     at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:105) ~[spring-websocket-4.2.4.RELEASE.jar:4.2.4.RELEASE] 

К сожалению, если выше постановка вопроса не clear.Will пружина поддержка отправки асинхронных сообщений как обычный javax WebSocket делает Session.getAsyncRemote(). SendText (String текст)

Что такое конфигурация сделал весной для отправки асинхронных сообщений с помощью WebSocket сессии

ответ

1

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

Кажется, очень похоже на это:

WebSocket async send can result in blocked send once queue filled

Я не вещь, которую вы обязательно должны использовать фьючерсы или механизмы, описанные в посте выше. То, что я на самом деле не получаю: зачем делать асинхронный вызов сервлетов? Конечно, несколько могут отправлять сообщения на том же RemoteEndPoint .. Но разве вы не можете просто делать синхронные вызовы для соответствующих классов и поддерживать тот же поток запросов-ответов, который вы используете, когда записи находятся в вашей базе данных? :)

UPDATE

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

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

Лично я использую WebSockets, чтобы иметь возможность отправить сообщение на произвольного пользователя что не обязательно сделал запрос - до тех пор, как он подключен, он должен получить сообщение.

Для этого я просто использую класс SimpMessagingTemplate, предлагаемый Spring, в поддержке их websocket. Для того, чтобы отправить сообщение любому пользователю, что я хочу, я делаю это:

@Autowired 
SimpMessagingTemplate smt; 

(.......) 
smt.convertAndSendToUser(recipient.getUsername(), "/queue/notify", payload); 

Так что в вашем случае, вы могли бы, в цикле:

  • замыкающие вызова метода экземпляра класса (вместо сервлет, нет сетевого перехода, вы не можете быть быстрее! Просто позвоните в свою логику/службу/независимо)
  • каждый раз, когда метод возвращает данные, используйте SimpMessagingTemplate, как в приведенном выше фрагменте :)
  • вы все еще может сделать это asyn если хочешь! :)

Делая это, вы уменьшаете задержку (вызывающие сервлеты добавляют много) и имеют надежную технику. Вы можете легко и быстро отправлять тысячи сообщений одному пользователю или нескольким пользователям по своему усмотрению, не наткнувшись на проблему «10000 для БЛОКИРОВКИ», которая, вероятно, поступает из более чем одного сервлета, «отвечающего на тот же вопрос»;)

Чтобы получить SimpMessagingTemplate с Spring, вам необходимо использовать тег <websocket:message-broker> или эквивалентную не-xml-java-config.

Я предлагаю, чтобы проверить этот документ, который имеет больше информации: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

и следующий пост, который я создал на SO, где я использую его (у меня есть еще одна проблема в должности, связанные с конфигурацией и яровой контекста иерархии, но, по крайней мере, у вас есть какой-то шаблон кода, чтобы посмотреть на код работает):

Spring Websocket : receiving nothing from SimpMessagingTemplate

Spring : how to expose SimpMessagingTemplate bean to root context ?

+0

Нам нужна respon чтобы время было быстрым, так как будет 2000 запросов в секунду ... так что не выполняются синхронные вызовы с сервисом. Так что мы не можем делать синхронные вызовы. –

+0

Можем ли мы получить удаленную конечную точку из объекта WebsocketSession? –

+0

@ niilzone .. Я разместил еще один вопрос с полными деталями. Http: //stackoverflow.com/questions/36318483/extracting-remote-endpoint-object-from-spring-websocket-session..Как код уже (жить в prod), и мы не используем push/socket js любую другую альтернативу? с изменением конфигурации mininmal/извлечением удаленной конечной точки? –