2

シンプルな Akka HTTP サーバーを持つ:

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。ポートがまだリッスンされているという行が残っています。

4

1 に答える 1

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()
  }
}
于 2012-06-14T17:13:57.517 に答える