Is Actor http://www.scala-lang.org/docu/files/api/scala/actors/Actor.html.链接和Actor http://www.scala-lang.org/docu/files/api/scala/actors/Actor.html.trapExit 您在寻找什么?
EDIT尝试这个。我将所有内容都转移到了 act 方法中。在远程参与者之间发送代理似乎也会引起问题。这里有一些关于这个可能的错误的讨论:http://www.scala-lang.org/node/6779 http://www.scala-lang.org/node/6779;参见斯蒂芬·库恩的评论。
package test
import scala.actors.{OutputChannel, AbstractActor, Exit, Debug, Actor} , Actor._
import scala.actors.remote.RemoteActor , RemoteActor._
object ActorTestA{
def main(args :Array[String]) {
println("Start A")
val a = new A().start
println("Fin A")
}
}
object ActorTestB{
def main(args :Array[String]) {
println("Start B")
val b = new B().start
b ! 'start
println("Fin B")
}
}
case class AA(hostname: String, port: Int, symbol: Symbol) {
def proxy = select(actors.remote.Node(hostname, port), symbol)
}
case class M1(sendRef :AA, m2 :M2)
case class M2(v1:String, v2 :String, sendRef :AA)
case class M3(m2 :M2)
object A { val portToUse = 20000 }
class A extends Actor {
def act = {
alive(A.portToUse)
register('A, this)
RemoteActor.classLoader = getClass().getClassLoader()
val proxy = select(actors.remote.Node("localhost", A.portToUse), 'A)
loop { react {
case M1(sendRef, m2) =>
println("A receives M1")
sendRef.proxy ! M3(m2)
self ! 'exit
case 'exit =>
println("A exits")
exit
case any => println("Unknown Msg: "+any)
} }
}
}
class B extends Actor {
def act = {
RemoteActor.classLoader = getClass().getClassLoader()
val portToUse = 20001
alive(portToUse)
register('B, this)
var proxy = AA("localhost", portToUse, 'B)
var resultTo :Option[OutputChannel[Any]] = None
loop { react {
case 'start =>
println("B starts")
val a = select(actors.remote.Node("localhost", A.portToUse), 'A)
a ! M1(proxy, M2("some","val", proxy))
resultTo = Some(sender)
case M3(M2(v1,v2,sendRef))=>
println("B receives M3")
resultTo match {
case Some(ch) => ch ! sendRef.proxy;
case None => println("ch missing!?")
}
self ! 'exit
case 'exit =>
println("B exits")
exit
case any => println("Unknown Msg: "+any)
} }
}
}