我是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")
}
}
问题:
- 在PriceActor中创建PositionActor是否更好?
- 在PriceActor中,如果我想记录价格已经更新的消息和同时向PositionActor发送消息,我该如何做呢?
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
我认为这比在上下文中查找演员更清晰。
我不会在另一个Actor
子类中嵌套一个(可能永远-但明天我可能会遇到导致我这样做的情况…)。这样做会使内部类型成为外部类型的依赖类型。内部世界的实例不能独立于外部世界的实例而存在。考虑到对Actor子类实例化的限制,可能很难用这种安排来建立您需要的Actor系统。
我不太清楚你在问(2)什么,你可以简单地:
def receive = {
case "Update Price" =>
log.info("Updating price")
positionActor ! "Update Position"
…
}
顺便说一下,我希望您使用正确的消息类型,而不是String
用于您的参与者间消息传递,您在这里显示的仅用于说明目的。似乎是这样,因为你的消息没有任何参数(价格或头寸)。虽然在某些情况下消息是常量(例如心跳),但在任何系统中,至少有一些消息包含消息值或类型本身以外的某种信息内容。