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 _ =>
}
}
}
}
"¿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
¿Has intentado con Scala 2.8 y ves que no se lanza ninguna excepción, pero es lanzado en 2.9.x – Jus12
Funciona para mí (en 2.9.0) – IttayD