2

Akkaを使用して、カスタムアプリケーションプロトコル用のTCPサーバーを実装しようとしています。私はここに与えられた例に従おうとしています:http ://doc.akka.io/docs/akka/2.0/scala/io.html for...yieldループ内で非ブロッキングIOを実行します。

イールドブロックの内側から例外をスローすると、ブロックの外側から例外をキャッチできないことがわかりました。ここでAkkaまたはScalaがどのように機能しているかについて根本的な誤解があると思いますので、ヒントをいただければ幸いです。

私はこれにコードを要約しました:

import akka.actor._
import java.net.InetSocketAddress

class EchoServer(port: Int) extends Actor {

  val state = IO.IterateeRef.Map.async[IO.Handle]()(context.dispatcher)

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

  def receive = {
    case IO.NewClient(server) =>
      val socket = server.accept()
      state(socket) flatMap (_ => EchoServer.processRequest(socket))
    case IO.Read(socket, bytes) =>
      state(socket)(IO.Chunk(bytes))
    case IO.Closed(socket, cause) =>
      state(socket)(IO.EOF(None))
      state -= socket
  }
}

object EchoServer extends App
{
  def processRequest(socket: IO.SocketHandle): IO.Iteratee[Unit] =
  {
    println( "In process request")
    try {
      for {
        bs <- IO take 1
      } yield {
        println("I'll get here")
        throw new Exception("Hey-o!")
        println("But not here ... as expected")
      }
    } catch {
      case e: Exception => println("And not here ... wtf?"); IO.Done()  // NEVER GETS HERE
    }
  }

  ActorSystem().actorOf(Props(new EchoServer(8080)))
}

ここで要点を理解する方が便利かもしれません:https ://gist.github.com/2296554

この状況でコントロールが私のキャッチブロックに到達しない理由を誰かが説明できますか?

Akkaでデバッグログをオンにすると、出力に次のメッセージが表示されることに気付きました。

[DEBUG] [04/03/2012 22:42:25.106] [EchoServerActorSystem-akka.actor.default-dispatcher-1] [Future] Hey-o!

それで、例外はAkkaディスパッチャーによって処理されていると思いますか?誰かがそれがどのように可能であるか説明できますか?

4

1 に答える 1

6
于 2012-04-04T07:10:10.030 に答える