我已经编写了一些actor类,我发现我必须处理这些实体的生命周期。例如,每当我的actor被初始化时,我想要一个方法被调用,以便我可以在消息队列(或打开数据库连接等)上设置一些监听器。
有相同的吗?我能想到的是Spring的InitialisingBean和DisposableBean
答案 0 :(得分:1)
Actor基本上是两种方法 - 构造函数和onMessage(Object): void
。
在其生命周期中没有任何东西可以自然地提供“布线”行为,这为您提供了一些选择。
使用主管演员创建其他演员。主管负责观察,启动和重启Actors失败 - 因此让主管了解集成系统的状态以避免不断重启通常很有价值。该Supervisor将创建和管理Service对象(可能通过Spring)并将它们传递给Actors。
在演员构建时使用您首选的初始化技术。这很棘手,但您当然可以将Spring与Actors结合使用。请注意,如果主管重新启动您的演员,您需要能够从您在首先启动它的Props对象中放置的任何内容中恢复其所需的状态。
按需连接所有内容。在Actor启动时按需打开连接(并根据需要缓存它们)。我发现我经常这样做 - 当它的连接不再起作用时,我让Actor失败了。主管将重新启动Actor,这将重新创建所有连接。
要记住的重要事项:
答案 1 :(得分:1)
这是一个典型的情况,您override methods会preStart()
,postStop()
等。我不会发现此问题。
当然,您必须了解详细信息 - 例如,在调用postStop()
之后异步调用actor.stop()
,而在启动Actor时调用preStart()
。这意味着数据库交互等潜在的缓慢/阻塞应该保持在最低限度。
您还可以使用Actor的构造函数来初始化数据。
正如Matthew所说,监督在Akka中起着重要作用 - 因此您可以指示主管在事件中执行特定的事情。例如,所谓的 DeathWatch - 如果其中一位演员正在观看"你可以得到通知。模具:
context.watch(child)
...
def receive = {
case Terminated(`child`) => lastSender ! "finished"
}