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

时间:2020-07-22 14:09:00

标签: scala akka-actor

在我的情况下,我有一个Actor类(例如Greeter),该类具有一个sendSecureMessage方法,我想在应用程序中使用该方法。问题是创建迎宾演员后,ActorSystem仅向我提供了对ActorRef的{​​{1}}引用,而我不能将Greeter与该引用一起使用。 有什么方法可以调用此功能?

sendSecureMessage

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

中的方法

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

如果方法确实访问内部actor字段/数据,则应引入一条消息,以调用此方法。

答案 1 :(得分:2)

这里有两个选择。

如果sendSecureMessage是不使用参与者状态的“静态”方法,则将其放在参与者的伴随对象中,然后直接从那里调用。

如果sendSecureMessage确实使用actor状态,则调用它的唯一安全方法是将带有参数的消息发送给actor,让actor调用该方法,然后将结果发送回作为答复。如果允许代码从其他线程调用actor上的方法,则所有同步保证都将超出窗口。