将消息从一个参与者发送到另一个参与者



我是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是否更好?
  1. 在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用于您的参与者间消息传递,您在这里显示的仅用于说明目的。似乎是这样,因为你的消息没有任何参数(价格或头寸)。虽然在某些情况下消息是常量(例如心跳),但在任何系统中,至少有一些消息包含消息值或类型本身以外的某种信息内容。

相关内容

最新更新