Akka를 사용하여 사용자 지정 응용 프로그램 프로토콜 용 TCP 서버를 구현하려고합니다. 여기에 주어진 예제를 따르려고 노력하고있어 : http://doc.akka.io/docs/akka/2.0/scala/io.html for ... 비상용 IO를 for ... yield 루프 내에서 수행하려고한다.Scala + Akka로 이상한 try/catch 동작
yield 블록 내부에서 예외를 throw하면 블록 외부에서 예외를 catch 할 수 없습니다. 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)))
}
여기에 요점 따르 어쩌면 더 편리 : 컨트롤이 상황에서 내 catch 블록에 도달하지 않는 이유 https://gist.github.com/2296554이
아무도 설명 할 수 있습니까?
[DEBUG] [04/03/2012 22:42:25.106] [EchoServerActorSystem-akka.actor.default-dispatcher-1] [Future] Hey-o!
그래서 나는 예외가 Akka 디스패처에 의해 처리지고 같아요
은 내가 Akka에서 디버그 로깅을 설정하는 경우, 내가 출력에이 메시지가 표시 것으로 나타났습니다? 아무도 그것이 가능한 방법을 설명 할 수 있습니까?
감사합니다, 정말 물건을 지 웁니다. –