问题 演员消息应该在哪里宣布?


我正在使用Akka开发一个应用程序,这个问题让我整个时间都认为消息声明与 Actor的。我应该在哪里声明消息?在接收器伴侣对象或发送者伴侣对象或第三位?


9548
2018-01-04 15:22


起源



答案:


Akka团队建议Message应该在同一个地方定义 props 方法应该是: 在Receiver的Companion对象中 因为Receiver实现了 receive 部分功能,需要知道它支持的所有消息。此外,多个发件人可以发送一组邮件(由Receiver实现),因此您无法将其放在一个发件人中。


6
2018-01-04 17:46



你能继续吗? “Akka团队推荐”?网页是合适的。 - Jacek Laskowski
我们建议这样做:-)在Soumya的答案=>中添加了文档的链接 doc.akka.io/docs/akka/2.3.8/scala/... - Konrad 'ktoso' Malawski
谢谢康拉德! - Soumya Simanta
@ Konrad'ktoso'Malawski我没有看到关于消息的部分在提供的链接中的位置:( - Jacek Laskowski
明确地将其放在该部分可能是一个好主意,问题创建: github.com/akka/akka/issues/16614 - Konrad 'ktoso' Malawski


答案:


Akka团队建议Message应该在同一个地方定义 props 方法应该是: 在Receiver的Companion对象中 因为Receiver实现了 receive 部分功能,需要知道它支持的所有消息。此外,多个发件人可以发送一组邮件(由Receiver实现),因此您无法将其放在一个发件人中。


6
2018-01-04 17:46



你能继续吗? “Akka团队推荐”?网页是合适的。 - Jacek Laskowski
我们建议这样做:-)在Soumya的答案=>中添加了文档的链接 doc.akka.io/docs/akka/2.3.8/scala/... - Konrad 'ktoso' Malawski
谢谢康拉德! - Soumya Simanta
@ Konrad'ktoso'Malawski我没有看到关于消息的部分在提供的链接中的位置:( - Jacek Laskowski
明确地将其放在该部分可能是一个好主意,问题创建: github.com/akka/akka/issues/16614 - Konrad 'ktoso' Malawski


如果 官方Typesafe Activator模板激活器-akka-scala-seed 对于Akka的良好实践而言,消息应该是伴随对象的一部分,如下所示 PingActor actor(直接从模板中复制):

package com.example

import akka.actor.{Actor, ActorLogging, Props}

class PingActor extends Actor with ActorLogging {
  import PingActor._

  var counter = 0
  val pongActor = context.actorOf(PongActor.props, "pongActor")

  def receive = {
    case Initialize => 
      log.info("In PingActor - starting ping-pong")
      pongActor ! PingMessage("ping")   
    case PongActor.PongMessage(text) =>
      log.info("In PingActor - received message: {}", text)
      counter += 1
      if (counter == 3) context.system.shutdown()
      else sender() ! PingMessage("ping")
  } 
}

object PingActor {
  val props = Props[PingActor]
  case object Initialize
  case class PingMessage(text: String)
}

注意 PingActor 它包含了演员所接受的所有消息(因为你可能已经注意到它没有被严格遵守 PongActor.PongMessage 也被接受,但未在伴随对象中定义 PingActor)。

从另一个问题 如何将actor消息限制为特定类型?    维克多说

通常的做法是声明Actor可以接收哪些消息   在Actor的伴侣对象中,这使得它变得非常容易   知道它能收到什么。


3
2018-01-04 22:25



实际上,这个例子表明消息类型可以(重新)用于不同的actor。也许这是一个很好的做法 命令 消息进入接收者的伴侣对象和 事件 别处的消息?在这里 PingMessage 应该 不 在... PingActor 伴侣对象,因为此actor没有收到此消息。正确的地方是的伴侣 PongActor。该 PongMessage 应该在收货 PingActor 伴侣对象。但它是事件,可以在中立的对象中定义,也可以由其他参与者发出。 - Sebastian
@Sebastian听起来有点太复杂了我的口味。如果有人问你“哪里”你马上就不能回答 - 让我们在这里使用简单的规则“在同伴中”很容易记住,并且因为它是“理解他们的人”而有意义,想想就像这个人就是那个人 协议”。 - Konrad 'ktoso' Malawski
@ Konrad'ktoso'Malawski我喜欢你评论中的3件事:1。约定,2。协议和3.处理对象/演员像生物 说 彼此。但最初的问题是: 我应该在哪里声明消息?在接收器伴侣对象或发件人伴侣对象? 对不起,如果我太严格了,但在上面的例子中,哪个伴侣对象并不明显 PingMessage 和 PongMessage 应该宣布。接收 PongActor 应按惯例理解 PingMessage 在他的 协议,不是吗? ;-) - Sebastian