0

在我的情况下,我有一个带有sendSecureMessage我想在应用程序中使用的方法的 Actor 类(比如 Greeter)。问题是在创建欢迎角色之后,ActorSystem 只为我提供了一个ActorRef引用,Greeter而我不能使用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")
4

2 回答 2

2

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

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

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

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

如果方法确实访问了内部参与者字段/数据,您应该引入一条调用此方法的消息。

于 2020-07-22T14:31:37.913 回答
2

这里有两个选项。

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

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

于 2020-07-22T14:31:49.837 回答