Я использую 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?
Спасибо! похоже, что это именно то, что мне нужно, smth, как 'ContainerProvider.getWebSocketContainer(). setAsyncSendTimeout (30_000)' должен делать то, что нужно. К счастью (или нет) мое приложение не построено на Spring – coolguy