Scala Actor + HttpServer

Scala で 簡易的な httpd を作れないかと調べていたら、Java に HttpServer という便利なクラスがあった。
handler は、Actor 上で使いたいので Executor を継承した ActorExecutor というのを作ってみた。

import java.net.InetSocketAddress
import java.util.concurrent.Executor
import com.sun.net.httpserver.{HttpExchange, HttpHandler, HttpServer}
import scala.actors.Actor.actor

class ActorExecutor extends Executor {
  def execute(r: Runnable) {
    println("Start execute")
    println("execute thread: " + Thread.currentThread.getName)
    actor {r.run}
    println("End execute")
  }
}

object SimpleHttpd {
  def main (args: Array[String]) {
    val handler = new HttpHandler {
      def handle(exchange: HttpExchange) {
        println("Start handle")
        println("handle thread: " + Thread.currentThread.getName)
        val out = exchange.getResponseBody
        exchange.sendResponseHeaders(200, 0)
        out.write("Handling that just works.".getBytes)
        out.close
        println("End handle")
      }
    }
    val server = HttpServer.create(new InetSocketAddress(9000), 0)
    server.createContext("/", handler)

    val exec = new ActorExecutor()
    server.setExecutor(exec)
    server.start
    println("main thread: " + Thread.currentThread.getName)
  }
}