在我的情况下,我有一个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
答案 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上的方法,则所有同步保证都将超出窗口。