Spring初始化bean的Akka等价物
我已经编写了一些actor类,我发现我必须掌握这些实体的生命周期。例如,每当初始化我的actor时,我希望调用一个方法,这样我就可以在消息队列上设置一些侦听器(或打开db连接等)Spring初始化bean的Akka等价物,akka,Akka,我已经编写了一些actor类,我发现我必须掌握这些实体的生命周期。例如,每当初始化我的actor时,我希望调用一个方法,这样我就可以在消息队列上设置一些侦听器(或打开db连接等) 有类似的吗?我能想到的等价物是Spring的InitialisingBean和DisposableBean。Actor基本上是两种方法——构造函数和onMessage(Object):void 在它的生命周期中,没有任何东西能够自然地提供“连接”行为,这就给了您一些选择 使用主管演员创建其他演员。监督员负责监视、启动和
有类似的吗?我能想到的等价物是Spring的InitialisingBean和DisposableBean。Actor基本上是两种方法——构造函数和onMessage(Object):void 在它的生命周期中,没有任何东西能够自然地提供“连接”行为,这就给了您一些选择
- Actor模型的目的是Actor不连续运行——它们只在有消息提供给它们时运行。如果将消息侦听器添加到某个参与者,则实际上是在添加可以访问该参与者的新线程。如果您使用监督,这可能是一个问题——重新启动的参与者可能会泄漏该线程,这反过来可能会导致参与者无法被垃圾收集。这也可能是一个问题,因为它引入了竞争条件,参与者的部分价值在于避免这种情况
- 从参与者系统的角度来看,执行I/O的参与者是阻塞的。如果有太多参与者同时执行I/O,则会耗尽调度程序的线程池并锁定系统
- 给定的Actor实例在其生命周期内可以在多个不同的线程上运行,但一次只能在一个线程上运行。这可能会让一些消息传递系统感到困惑——例如,JMS的规范断言会话不能在多个线程上使用,许多JMS将其解释为“只能在启动会话的线程上运行”。您可能会看到由此产生的警告,甚至异常
- 出于这些原因,我更喜欢使用非参与者代码来执行一些I/O。例如,我将有一个传入消息侦听器对象,其职责是将JMS消息从队列中移除,使用它们创建POJO消息,并向参与者系统发送通知。或者,我将使用一个Actor,但将该Actor放在启用线程固定的自定义调度程序上。这可以确保该参与者只在特定线程上运行,不会阻塞其他非I/O参与者正在使用的系统
onMessage(Object):void
在它的生命周期中,没有任何东西能够自然地提供“连接”行为,这就给了您一些选择
- Actor模型的目的是Actor不连续运行——它们只在有消息提供给它们时运行。如果将消息侦听器添加到某个参与者,则实际上是在添加可以访问该参与者的新线程。如果您使用监督,这可能是一个问题——重新启动的参与者可能会泄漏该线程,这反过来可能会导致参与者无法被垃圾收集。这也可能是一个问题,因为它引入了竞争条件,参与者的部分价值在于避免这种情况
- 从参与者系统的角度来看,执行I/O的参与者是阻塞的。如果有太多参与者同时执行I/O,则会耗尽调度程序的线程池并锁定系统
- 给定的Actor实例在其生命周期内可以在多个不同的线程上运行,但一次只能在一个线程上运行。这可能会让一些消息传递系统感到困惑——例如,JMS的规范断言会话不能在多个线程上使用,许多JMS将其解释为“只能在启动会话的线程上运行”。您可能会看到由此产生的警告,甚至异常
- 为了
context.watch(child) ... def receive = { case Terminated(`child`) => lastSender ! "finished" }