У меня есть два сервера, которые прослушивают порт TCP за балансировкой нагрузки. Балансировщик нагрузки может определить, была ли попытка подключения TCP к клиенту неудачной и повторить попытку на второй сервер, не отбрасывая это соединение. Я хочу, чтобы можно было отключить любой из этих двух серверов для обслуживания, не отбрасывая одну коллекцию клиентов.
Мои серверы используют этот код для обработки клиентских запросов:
ServerSocketFactory ssf = ...
ServerSocket serverSocket = ssf.createServerSocket(60000);
try {
while (true) {
Socket socket = serverSocket.accept();
...// Do the processing
}
} catch (IOException e) {
...
}
...
Моя первоначальная мысль заключалась в том, чтобы добавить логическое значение, которое будет установлено при завершении работы приложения и предотвратить новые вызовы serverSocket.accept()
, ожидая, пока все существующее соединение будет обработано и закрыто. Однако новое соединение устанавливается еще до вызова serverSocket.accept()
. Вот что я вижу в Wireshark, если я поставил точку останова перед этим вызовом.
Проблема в этом пункте, как только я вызываю serverSocket.close()
, все такие клиентские соединения удаляются. То, что я хочу достичь, - это один из способов сказать ServerSocket прекратить принимать все новые подключения (т.е. Отправлять только RST для новых подключений или отпускать их тайм-аут), поэтому балансировщик нагрузки может перенаправить их на другой сервер, но в то же время не отбрасывать любые уже установленные соединения.
Изменить: Я ищу какое-то автоматическое решение, которое не требовало бы меня менять настройки балансировки нагрузки или настройки ОС каждый раз, когда я хочу обновить приложение.