2012-06-14 3 views
2

Имея простой Akka HTTP сервер:Остановка HTTP сервер Akka

package org.package.some 

import akka.actor.{IOManager, IO, Actor} 
import java.net.InetSocketAddress 

class HttpServerActor extends Actor {  
    val state = IO.IterateeRef.Map.async[IO.Handle]()(context.dispatcher) 

    override def preStart() { 
    IOManager(context.system) listen new InetSocketAddress(8000) 
    } 

    def receive = { 
    case IO.NewClient(server) => 
     val socket = server.accept() 
     state(socket) flatMap (_ => RequestProcessor.processRequest(socket)) 

    case IO.Read(socket, bytes) => 
     state(socket)(IO Chunk bytes) 

    case IO.Closed(socket, cause) => 
     state(socket)(IO EOF None) 
     state -= socket 

    case "STOP" => 
     println("WHAT'S HERE??") 
    } 
} 

Как бы один остановить сервер, то есть гнездо близко сервера на порт 8000?

Просто убийство актера не имеет никакого эффекта: остается строка в netstat -a | grep 8000, в которой говорится, что порт все еще прослушивается.

ответ

3

IOManager.listen возвращает ServerHandle, который имеет метод close.

class HttpServerActor extends Actor { 
    val state = IO.IterateeRef.Map.async[IO.Handle]()(context.dispatcher) 
    var handle: ServerHandle = _ 

    override def preStart() { 
    handle = IOManager(context.system) listen new InetSocketAddress(8000) 
    } 

    def receive = { 
    // ... 
    case "STOP" => 
     handle.close() 
    } 
} 
+0

Спасибо! ('SocketHandle' следует заменить на' ServerHandle') – nab

+0

Готово. Копировать/вставить из неправильного метода :-) – leedm777

Смежные вопросы