2017-01-05 7 views
1

Я использую javax.websocket API в своем приложении. Я посылаю сообщение от сервера к клиенту, как это:javax.websocket - таймаут для доставки сообщения

Future<Void> messageFuture = session.getAsyncRemote().sendText(message); 
messageFutures.add(messageFuture); // List<Future<Void>> messageFutures 

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

for (i = 1..N) { 
    result = doStuff() 
    sendMessage(result) 
} 

Таким образом, невозможно ожидать доставки сообщений на каждую итерацию.

После отправки всех сообщений мне нужно дождаться завершения всех Future (все сообщения будут доставлены). И чтобы быть в безопасности, мне нужно использовать некоторый тайм-аут, например, «если сервер отправляет сообщение клиенту и клиенту, он не подтверждает получение через 30 секунд, а затем считает, что соединение с websocket нарушено» - насколько я понимаю, это должно быть возможно сделать с веб-сайтами, поскольку они работать над TCP.

Существует метод session.setMaxIdleTimeout(long):

Установите число ненулевых миллисекунд до этой сессии будет закрыт контейнером, если он неактивен, то есть никакие сообщений либо отправлены или получен. Значение, равное 0 или отрицательное, указывает, что сеанс никогда не будет превышать тайм-аут из-за неактивности.

но я действительно не уверен, что это то, что я хочу (не так ли?). Итак, как я могу установить тайм-аут, как я описал с помощью javax.websocket API?

ответ

1

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

Более точная функция для проверки таймаута при отправке - setAsyncSendTimeout.

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


По моему опыту с весной реализация тайм-аута, предоставляемая Spring, на самом деле не конфигурируется. См. How do you quickly close a nonresponsive websocket in Java Spring Tomcat? Я не уверен, применимо ли это к вашей реализации websocket.

+0

Спасибо! похоже, что это именно то, что мне нужно, smth, как 'ContainerProvider.getWebSocketContainer(). setAsyncSendTimeout (30_000)' должен делать то, что нужно. К счастью (или нет) мое приложение не построено на Spring – coolguy

Смежные вопросы