有没有办法在 akka 应用程序中使用扩展 Actor 类 的任意实现方法?

Is there a way to use arbitary implemented methods of extended Actor classes in an akka app?

在我的情况下,我有一个 Actor class(例如 Greeter)和我想在应用程序中使用的 sendSecureMessage 方法。问题是在创建迎宾演员后,ActorSystem 只为我提供了 ActorRefGreeter 的引用,而我不能将 sendSecureMessage 与该引用一起使用。 有什么方法可以调用这个函数吗?

def sendSecureMessage(sender: ActorRef,receiver: ActorRef, message: Any, automata: Automata):

就是class Greeter(message: String, printerActor: ActorRef) extends Actor

中的方法

这就是我创建演员的方式:

  val firstActor: ActorRef =
       system.actorOf(Greeter.props("first",printer).withDispatcher("custom-dispatcher"),"firstActor")

Actor 与任何“public”访问隔离,只能通过消息使用。这就是为什么在创建 actor 时只得到一个 ActorRef 的原因。

在不访问任何内部参与者字段的情况下,您仍然可以共享方法 sendSecureMessage 的代码,例如 context

您可以如下所示将方法 sendSecureMessage 提取到 Greeter 的伴生对象中,并从其他地方使用此方法而无需 ActorRef.

object Greeter {
  def sendSecureMessage(sender: ActorRef, receiver: ActorRef, message: Any, automata: Automata)
}

如果方法确实访问内部 actor fields/data,您应该引入调用此方法的消息。

这里有两个选项。

如果 sendSecureMessage 是一个不使用 actor 状态的“静态”方法,则将它放在 actor 的伴随对象中并从那里直接调用它。

如果 sendSecureMessage 确实使用了 actor 状态,那么调用它的唯一安全方法是向 actor 发送带有参数的消息,让 actor 调用该方法,然后将结果作为回复发回.如果您允许代码从不同线程调用 actor 上的方法,那么所有同步保证都会超出 window.