既然您说您正在寻找如何确保以这种方式从 Akka Actor 创建异步任务将破坏它提供给您的 Akka 并发模式,这里有一些基于您的类的非常简单的示例。
正如我在评论中所建议的那样,这不是演示如何从父演员生成子演员的答案。正如你所说,你有兴趣展示如何打破 Akka 并发模式。我建议您寻找如何做到这一点的简单示例。也许这个例子有帮助。
import akka.actor.{Actor, ActorSystem, Props}
import scala.util.Random
object BreakingAkkaConcurrency {
def main(args: Array[String]): Unit = {
val actorSystem = ActorSystem("BreakingAkkaConcurrency")
val unsecureActor = actorSystem.actorOf(Props[UnsecureActor], "unsecureActor")
unsecureActor ! "1"
unsecureActor ! "2"
unsecureActor ! "3"
unsecureActor ! "4"
unsecureActor ! "5"
unsecureActor ! "6"
unsecureActor ! "7"
unsecureActor ! "8"
unsecureActor ! "9"
unsecureActor ! "10"
Thread.sleep(10000)
}
}
class UnsecureActor extends Actor {
def methodWithThread(): Unit = {
}
override def receive: Receive = {
case msg: String =>
var t = new ThreadExample(msg)
// by starting a new thread inside an Akka actor you break the synchronous pattern provided by Akka
t.start()
}
}
class ThreadExample(id: String) extends Thread {
override def run() {
// simulate a random computation which will potentially break the order of messages processed by Akka actors
// This is where the Akka actors don't have control anymore.
Thread.sleep(Random.nextInt(10) * 1000)
println(s"finished $id");
}
}
输出的顺序与unsecureActor ! "1"
发送消息的顺序不同。
finished 9
finished 4
finished 1
finished 7
finished 3
finished 2
finished 8
finished 5
finished 6
finished 10