Горячая замена ServerSocket (Java) - PullRequest
1 голос
/ 31 марта 2012

Я пытаюсь записать код в сокеты горячей замены в Java.

Вот суть кода, который я сейчас использую:

// initial server initialization
ServerSocket server1 = new ServerSocket(port);

// ... code to accept and process requests

// new server initialization
ServerSocket server2 = new ServerSocket();

// attempt at hotswap
server1.close();
server2.bind(port);

// .. more code

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

Два вопроса:

Есть ли способ гарантировать, что ни одно соединение не будет разорвано??

Если есть способ убедиться, что ни одно соединение не сброшено, работает ли он, если экземпляры класса ServerSocket находятся на разных виртуальных машинах?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 декабря 2013

Закрытие ServerSocket означает, что обработчик server1 не обрабатывает новые входящие соединения, об этом заботится server2.Все идет нормально.Вы можете собирать мусор server1, когда на нем больше нет подключенных Socket s.

В течение определенного периода времени (короче или дольше) порт помечается как «не открытый» в сети ОС.драйвер после закрытия первого ServerSocket и открытия второго (поскольку ОС не может знать о нашем намерении запустить новый сокет сразу после закрытия первого).

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

A Возможное решение

Используйте Java-конструкции NIO, которые порождают новый поток для каждого входящего запроса, смотрите ServerSocketChannel и не забудьте проверить библиотеку http://netty.io/, которая имеет несколько конструкций для этого.

Убедитесь, чточто вы можете установить обработчик для входящего запроса динамически (и потокобезопасно :), это позволит беспрепятственно изменять handling входящих запросов, но вы не сможете обменять ServerSocket (но, скорее всего, это не совсем то, что вам нужно).

...