2011-06-09 7 views
6

El siguiente código funciona bien en Scala 2.8 pero no en 2.9.0.1 (copie y pegue en REPL). Esto lanzará una excepción en 2.9.0.1.¿Es esto un error en scala 2.9.0.1 actor library

import scala.actors.Actor 
import scala.actors.TIMEOUT 

object A2 extends Actor { 
    def act = { 
    loop { 
     react { 
     case "hello" => 
      val s = sender 
      reactWithin(2000){ 
      case i:Int => s ! "hello" 
      case TIMEOUT => s ! "TIMEOUT" 
      } 
     case _ => 
     } 
    } 
    } 
} 

object A1 extends Actor { 
    def act = { 
    loop { 
     react { 
     case m:String => println (A2 !? (1000, m)) 
     case _ => 
     } 
    } 
    } 
} 

A1.start 
A2.start 

A1 ! "hi" 
A1 ! "hello" 

Si la excepción no es lanzado inmediatamente, seguir haciendo A1 ! "hi" o A1 ! "hello" un par de veces.

¿Es esto un error en Scala 2.9.0.1, o algo está mal con el código?

[EDIT] Olvidó agregar la excepción real lanzada.

scala> [email protected]: caught java.lang.RuntimeException: unhandled timeout 
java.lang.RuntimeException: unhandled timeout 
    at scala.sys.package$.error(package.scala:27) 
    at scala.actors.Actor$class.receiveWithin(Actor.scala:606) 
    at $line4.$read$$iw$$iw$A1$.receiveWithin(<console>:10) 
    at scala.actors.Channel.receiveWithin(Channel.scala:71) 
    at scala.actors.ActorCanReply$class.$bang$qmark(ActorCanReply.scala:32) 
    at $line3.$read$$iw$$iw$A2$.$bang$qmark(<console>:9) 
    at $line4.$read$$iw$$iw$A1$$anonfun$act$1$$anonfun$apply$1.apply(<console>:15) 
    at $line4.$read$$iw$$iw$A1$$anonfun$act$1$$anonfun$apply$1.apply(<console>:13) 
    at scala.actors.ReactorTask.run(ReactorTask.scala:31) 
    at scala.actors.Reactor$class.resumeReceiver(Reactor.scala:129) 
    at $line4.$read$$iw$$iw$A1$.scala$actors$ReplyReactor$$super$resumeReceiver(<console>:10) 
    at scala.actors.ReplyReactor$class.resumeReceiver(ReplyReactor.scala:68) 
    at $line4.$read$$iw$$iw$A1$.resumeReceiver(<console>:10) 
    at scala.actors.Actor$class.searchMailbox(Actor.scala:500) 
    at $line4.$read$$iw$$iw$A1$.searchMailbox(<console>:10) 
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(Reactor.scala:117) 
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114) 
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114) 
    at scala.actors.ReactorTask.run(ReactorTask.scala:33) 
    at scala.concurrent.forkjoin.ForkJoinPool$AdaptedRunnable.exec(ForkJoinPool.java:611) 
    at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325) 

Edit2: Programa independiente y sin REPL

package scalaapplication5 
import scala.actors.Actor._ 
import scala.actors.Actor 
import scala.actors.TIMEOUT 


object Main { 
    A1.start 
    A2.start 
    def main(args: Array[String]): Unit = { 
    while (true){ 
     A1 ! "hi" 
     A1 ! "hello" 
     Thread.sleep(1000) 
    } 
    } 
} 

object A2 extends Actor { 
    def act = loop { 
    react { 
     case "hello" => 
     val s = sender 
     reactWithin(2000){ 
      case i:Int => s ! "hello" 
      case TIMEOUT => s ! "TIMEOUT" 
     } 
     case _ => 
    } 
    } 
} 

object A1 extends Actor { 
    def act = { 
    loop { 
     react { 
     case m:String => println (A2 !? (1000, m)) 
     case _ => 
     } 
    } 
    } 
} 
+3

"¿Es esto un error en Scala 2.9.0.1, o algo está mal con el código?" - No puedo decir la diferencia entre Scala y Esperanto, pero sé que la respuesta a esa pregunta casi invariablemente es "es tu código" :-) – paxdiablo

+0

¿Has intentado con Scala 2.8 y ves que no se lanza ninguna excepción, pero es lanzado en 2.9.x – Jus12

+0

Funciona para mí (en 2.9.0) – IttayD

Respuesta

3

Esto no parece que haya habido un error en el marco Actor. Parece que nunca se supone que debes obtener una RuntimeException. See the Scala Bug Tracker para más detalles. Se arregló el 7 de julio de 2011 y probablemente esté a la espera de ser lanzado.

Cuestiones relacionadas