2012-06-14 3 views
2

Avoir un simple serveur HTTP Akka:Arrêt serveur 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??") 
    } 
} 

Comment peut-on arrêter le serveur, à savoir la prise à proximité du serveur sur le port 8000? La suppression de l'acteur n'a aucun effet: il reste une ligne netstat -a | grep 8000 indiquant que le port est toujours écouté.

Répondre

3

IOManager.listen renvoie ServerHandle, qui a une méthode 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

Merci! ('SocketHandle' devrait être remplacé par' ServerHandle') – nab

+0

Terminé. Copier/coller de la mauvaise méthode :-) – leedm777