Создаю сервер на Java, каждому клиенту - свой поток, для создания и управления потоками использую класс ExecutorService.
Но беда в том, что некоторые запросы от клиента могут занять слишком много времени, а то и вовсе зависнуть в ожидании ответа от сторонних серверов (такое редко, но случается). Чтобы избавится от этой проблемы я решил по таймауту удалять поток, чтобы не забивать пул потоков, но как это реализовать?
Использовать таймаут соединения - если долго то забивать на клиента. Или NIO - там можно обрабатывать соединение без блокировок (и как бонус можно заводить один поток на несколько клиентов).
Таймаут соединения не катит, поток-то не очистится. Мне нужно именно под каждого клиента свой поток и каждому потоку таймаут выполнения, после которого поток останавливается и очищается (будет супер, если еще и соединение с клиентом закроется).
Если у вас Executor то он сам следит за потоками. Зачем их убивать? Пусть себе крутятся, ведь Executor умеет их переиспользовать. Вам важно прервать выполнение вашей задачи которую вы засабмитили в Executor. Вот об том я и написал.
ServerSocket Listener = new ServerSocket(CONNECTION_PORT);
Сейчас потестил, поставил на сокет (который клиента) таймаут в 1 мс (Socket.setSoTimeout(1);) - никаких ошибок, хотя среднее время на выполнение тестовых запросов (все одинаковые) ~305 мс..
Что не так?
Эм, вы пытаетесь достучатся до сокета-сервера, у которого тайм-аут на прием соединений - зачем? Мне нужно, чтобы сервер, получив клиента создал ему поток, а этот поток по истечению N-ого кол-ва миллисекунд/секунд завершил свое выполнение по таймауту. У вас-же таймаут тоит не там, сервер после таймаута просто не может принять клиентов.
1) Тайм аут не на прием соединения а на ИО с клиентского сокета
2) Поток не услышав ответа от клиента в тетчение 100мс закончился с исключением.
3) Видимо я не понял что вы хотите на самом деле.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.