从一个actor向另一个actor发送消息

时间:2014-03-27 15:35:08

标签: scala akka

我是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")

    }

}

问题:

  1. 在PriceActor中创建PositionActor会更好吗?
  2. 在PriceActor中,如果我想记录价格已更新的消息同时向PositionActor发送消息,我该怎么做?

2 个答案:

答案 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用于您的跨行动者消息传递,此处显示的内容仅用于说明目的。似乎必须如此,因为您的消息不带任何参数(价格或位置)。虽然有些情况下消息是常量(例如心跳),但在任何系统中,至少有一些系统会承载除消息值或类型本身以外的某种信息内容。