2015-03-10 5 views
0

Выпуск IO(Http) ! Http.Bind начинает прослушивание на порту и прием соединений. Однако сообщение Http.Unbind не делает обратное - порт остается открытым. То есть он обрабатывается, и в журнале отображаются:Соответствующий Akka IO (Http) unbinding

DEBUG | TcpListener | Unbinding endpoint /0:0:0:0:0:0:0:0:38080 
DEBUG | TcpListener | Unbound endpoint /0:0:0:0:0:0:0:0:38080, stopping listener 
INFO | HttpListener | Unbound from /0.0.0.0:38080 

Но порт по-прежнему обрабатывается приложением.

Исходный код TcpListener показывает, что Bind регистрирует канал сокета в селекторе, но развязка просто закрывает канал. Для того, чтобы селектор позволял этому сокету фактически идти, нужно сделать вызов Selector.select*() и это (я предполагаю) не произойдет.

Как-то я не думаю, что это ошибка Akka, но я делаю что-то неправильно. Каков правильный способ развязки гнезда IO(Http)?

ответ

0

Отвяжите и дождитесь, когда ответ Unbound будет правильным. Но обычно операционные системы не сразу показывают недавно освобожденные порты как свободные, а скорее сохраняют их на некоторое время, если приложение хочет повторно использовать его. Например, в Java, если связать сокет необходимо указать

serverSocket.setReuseAddress(true); 

явно, чтобы он доступен, как только несвязанные.

Я полагаю, что вы не ожидаете, что сообщение Unbound в вашем коде будет правильно (хотя, похоже, это не так из ваших журналов), или вы испытываете именно этот сценарий.

+0

Я получаю команду 'Unbound'. Это тоже не временное состояние. Сокет остается в состоянии «LISTENING» в течение нескольких часов, пока я не закрою все приложение. –

+0

Возможно ли, что вы отвязаете tcp, но не udp или наоборот? –

+1

Нет, я уверен, что спрей-бис не использует HTTP через UDP. –