Я запускаю двух удаленных актеров на одном хосте, которые просто повторяют все, что им отправлено.Затем я создаю другого актера, который отправляет некоторое количество сообщений (используя !!) обоим акторам и сохраняю объекты List of Future, содержащие ответы от этих акторов.Затем я перебираю этот список, извлекая результаты каждого будущего.Проблема в том, что большую часть времени некоторые фьючерсы никогда не возвращаются, даже если актер утверждает, что отправил ответ.Проблема возникает случайным образом, иногда она проходит через весь список, но большую часть времени она застревает в какой-то момент и зависает на неопределенное время.
Вот код, который создает проблему на моей машине:
Sink.scala:
import scala.actors.Actor
import scala.actors.Actor._
import scala.actors.Exit
import scala.actors.remote.RemoteActor
import scala.actors.remote.RemoteActor._
object Sink {
def main(args: Array[String]): Unit = {
new RemoteSink("node03-0",43001).start()
new RemoteSink("node03-1",43001).start()
}
}
class RemoteSink(name: String, port: Int) extends Actor
{
def act() {
println(name+" starts")
trapExit=true
alive(port)
register(Symbol(name),self)
loop {
react {
case Exit(from,reason) =>{
exit()
}
case msg => reply{
println(name+" sending reply to: "+msg)
msg+" back at you from "+name
}
}
}
}
}
Source.scala:
import scala.actors.Actor
import scala.actors.Actor._
import scala.actors.remote.Node;
import scala.actors.remote.RemoteActor
import scala.actors.remote.RemoteActor._
object Source {
def main(args: Array[String]):Unit = {
val peer = Node("127.0.0.1", 43001)
val source = new RemoteSource(peer)
source.start()
}
}
class RemoteSource(peer: Node) extends Actor
{
def act() {
trapExit=true
alive(43001)
register(Symbol("source"),self)
val sinks = List(select(peer,Symbol("node03-0"))
,select(peer,Symbol("node03-1"))
)
sinks.foreach(link)
val futures = for(sink <- sinks; i <- 0 to 20) yield sink !! "hello "+i
futures.foreach( f => println(f()))
exit()
}
}
Что я делаю не так?