我是Scala AKKA的新手,我正在尝试编写一些简单的例子。我有一个简单的例子,其中价格更新事件应该触发位置更新事件。这是代码:
import akka.actor.{Props, ActorSystem}
object Main {
def main(args: Array[String]): Unit = {
val system = ActorSystem("system")
val priceActor = system.actorOf(Props[PriceActor], "priceActor")
val positionActor = system.actorOf(Props[PositionActor], "positionActor")
priceActor ! "Update Price"
}
}
class PositionActor extends Actor {
val log = Logging(context.system, this)
def receive = {
case "Update Position" => log.info ("Position Updated")
case _ => log.info("Received an unknown message")
}
}
class PriceActor extends Actor {
val log = Logging(context.system, this)
def receive = {
case "Update Price" => context.actorSelection("akka://system/user/positionActor") ! "Update Position"
case _ => log.info("Received an unknown message")
}
}
问题:
答案 0 :(得分:0)
2)case
的正文可以包含多个声明:
def receive = {
case "Update Price" =>
context.actorSelection("akka://system/user/positionActor") ! "Update Position"
log.info("Price updated!)
case _ => log.info("Received an unknown message")
}
1)如果您将PriceActor
视为PositionActor
的逻辑父级或主管,那么这取决于您的应用程序的逻辑,那么是。否则,最好在main
中创建它并将其作为构造函数参数传递给PriceActor
:
val positionActor = system.actorOf(Props[PositionActor], "positionActor")
val priceActor = system.actorOf(Props(classOf[PriceActor], "priceActor", positionActor))
class PriceActor(positionActor: ActorRef) extends Actor
我认为它比在上下文中查找演员更清晰。
答案 1 :(得分:0)
我不会将一个Actor
子类嵌套在另一个中(可能永远 - 但明天我可能会遇到导致我无论如何都要这样做的情况......)。这样做会使内部的一个成为外部的依赖类型。内部实例不能独立于外部实例存在。鉴于对Actor子类实例化的限制,可能很难设置您需要的actor系统。
我不太确定你问的是什么(2)。你可以简单地说:
def receive = {
case "Update Price" =>
log.info("Updating price")
positionActor ! "Update Position"
…
}
顺便说一句,我希望您使用正确的消息类型,而不是String
用于您的跨行动者消息传递,此处显示的内容仅用于说明目的。似乎必须如此,因为您的消息不带任何参数(价格或位置)。虽然有些情况下消息是常量(例如心跳),但在任何系统中,至少有一些系统会承载除消息值或类型本身以外的某种信息内容。