Scala 从一个参与者向另一个参与者发送消息

Scala 从一个参与者向另一个参与者发送消息,scala,akka,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[Pr

我是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您的案例正文可以包含多个陈述:

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:

我认为这比在上下文中查找actor更干净。

我不会将一个actor子类嵌套在另一个actor子类中,可能永远不会,但明天我可能会遇到导致我这样做的情况…。这样做会使内部的一个成为外部的一个依赖类型。内部实例不能独立于外部实例而存在。考虑到对Actor子类实例化的限制,可能很难按照这种安排设置所需的Actor系统

我不太清楚你在第二个问题中问了什么。你可以简单地:

def receive = {
  case "Update Price" =>
    log.info("Updating price")
    positionActor ! "Update Position"
  …
}

顺便说一下,我希望您使用的是正确的消息类型,而不是字符串来进行参与者间的消息传递,您在这里展示的内容仅用于说明目的。看来一定是这样,因为你的信息没有任何价格或位置参数。在某些情况下,消息是恒定的,例如,在任何系统中,至少有一些消息包含消息值或类型本身以外的某种信息内容。

请整理您的代码。缩进在地图上到处都是!通常情况下,位置应始终在新的价格事件中更新,因此,是的,PriceActor是PositionActor的逻辑父级。那么,一般来说,使用这种类型的推理来设置参与者系统结构是否是一种良好的做法?在您的另一条评论中,您说您希望两个参与者都是独立的,那么PriceActor不应该是位置参与者。创建一个参与者意味着成为它的父级和主管,如果PriceActor不关心PositionActor生命周期,那么它就不应该是它的父级。是的,这就是我发布这个简单示例的原因。我不确定什么是最佳做法。您强调了我所关心的问题,即PositionActor现在变得依赖于PriceActor。理想情况下,我希望他们的活力彼此独立。因此,您似乎赞成像我所做的那样获取对PositionActor对象的引用,或者像@vptheron所做的那样通过构造函数传递?如果您的actor拓扑是固定的,那么上游actor如何获取对下游actor的引用并不重要。但是,如果存在多个参与者网络,或者消息发送的拓扑结构是动态的,那么您需要以某种方式将其提供给发送参与者。这可能是通过将ActorRef作为构造函数参数传递,将actor的路径名作为构造函数参数传递,或者甚至通过向它发送一条消息,告诉它send your position updates here,这里同样可以是ActorRef或actor path name。
def receive = {
  case "Update Price" =>
    log.info("Updating price")
    positionActor ! "Update Position"
  …
}