Spring初始化bean的Akka等价物

Spring初始化bean的Akka等价物,akka,Akka,我已经编写了一些actor类,我发现我必须掌握这些实体的生命周期。例如,每当初始化我的actor时,我希望调用一个方法,这样我就可以在消息队列上设置一些侦听器(或打开db连接等) 有类似的吗?我能想到的等价物是Spring的InitialisingBean和DisposableBean。Actor基本上是两种方法——构造函数和onMessage(Object):void 在它的生命周期中,没有任何东西能够自然地提供“连接”行为,这就给了您一些选择 使用主管演员创建其他演员。监督员负责监视、启动和

我已经编写了一些actor类,我发现我必须掌握这些实体的生命周期。例如,每当初始化我的actor时,我希望调用一个方法,这样我就可以在消息队列上设置一些侦听器(或打开db连接等)


有类似的吗?我能想到的等价物是Spring的InitialisingBean和DisposableBean。Actor基本上是两种方法——构造函数和onMessage(Object):void

在它的生命周期中,没有任何东西能够自然地提供“连接”行为,这就给了您一些选择

  • 使用主管演员创建其他演员。监督员负责监视、启动和重新启动发生故障的参与者——因此,拥有一个了解集成系统状态的监督员,以避免持续重新启动通常是很有价值的。该主管将创建和管理服务对象(可能通过Spring),并将其传递给参与者

  • 在构建Actor时使用您首选的初始化技术。这很棘手,但您当然可以将Spring与Actor结合起来。请注意,如果主管重新启动您的演员,您需要能够从您放置在道具对象中的任何内容中恢复其所需的状态,您首先使用道具对象来启动它

  • 按需布线。在参与者启动时按需打开连接(并根据需要缓存它们)。我发现我经常这样做——当演员的连接不再工作时,我会让演员失败。主管将重新启动Actor,这将重新创建所有连接

  • 记住一些重要的事情:

    • Actor模型的目的是Actor不连续运行——它们只在有消息提供给它们时运行。如果将消息侦听器添加到某个参与者,则实际上是在添加可以访问该参与者的新线程。如果您使用监督,这可能是一个问题——重新启动的参与者可能会泄漏该线程,这反过来可能会导致参与者无法被垃圾收集。这也可能是一个问题,因为它引入了竞争条件,参与者的部分价值在于避免这种情况
    • 从参与者系统的角度来看,执行I/O的参与者是阻塞的。如果有太多参与者同时执行I/O,则会耗尽调度程序的线程池并锁定系统
    • 给定的Actor实例在其生命周期内可以在多个不同的线程上运行,但一次只能在一个线程上运行。这可能会让一些消息传递系统感到困惑——例如,JMS的规范断言会话不能在多个线程上使用,许多JMS将其解释为“只能在启动会话的线程上运行”。您可能会看到由此产生的警告,甚至异常
    • 出于这些原因,我更喜欢使用非参与者代码来执行一些I/O。例如,我将有一个传入消息侦听器对象,其职责是将JMS消息从队列中移除,使用它们创建POJO消息,并向参与者系统发送通知。或者,我将使用一个Actor,但将该Actor放在启用线程固定的自定义调度程序上。这可以确保该参与者只在特定线程上运行,不会阻塞其他非I/O参与者正在使用的系统

    参与者基本上是两种方法——构造函数和
    onMessage(Object):void

    在它的生命周期中,没有任何东西能够自然地提供“连接”行为,这就给了您一些选择

  • 使用主管演员创建其他演员。监督员负责监视、启动和重新启动发生故障的参与者——因此,拥有一个了解集成系统状态的监督员,以避免持续重新启动通常是很有价值的。该主管将创建和管理服务对象(可能通过Spring),并将其传递给参与者

  • 在构建Actor时使用您首选的初始化技术。这很棘手,但您当然可以将Spring与Actor结合起来。请注意,如果主管重新启动您的演员,您需要能够从您放置在道具对象中的任何内容中恢复其所需的状态,您首先使用道具对象来启动它

  • 按需布线。在参与者启动时按需打开连接(并根据需要缓存它们)。我发现我经常这样做——当演员的连接不再工作时,我会让演员失败。主管将重新启动Actor,这将重新创建所有连接

  • 记住一些重要的事情:

    • Actor模型的目的是Actor不连续运行——它们只在有消息提供给它们时运行。如果将消息侦听器添加到某个参与者,则实际上是在添加可以访问该参与者的新线程。如果您使用监督,这可能是一个问题——重新启动的参与者可能会泄漏该线程,这反过来可能会导致参与者无法被垃圾收集。这也可能是一个问题,因为它引入了竞争条件,参与者的部分价值在于避免这种情况
    • 从参与者系统的角度来看,执行I/O的参与者是阻塞的。如果有太多参与者同时执行I/O,则会耗尽调度程序的线程池并锁定系统
    • 给定的Actor实例在其生命周期内可以在多个不同的线程上运行,但一次只能在一个线程上运行。这可能会让一些消息传递系统感到困惑——例如,JMS的规范断言会话不能在多个线程上使用,许多JMS将其解释为“只能在启动会话的线程上运行”。您可能会看到由此产生的警告,甚至异常
    • 为了
      context.watch(child)
      
      ...
      
      def receive = {
          case Terminated(`child`) => lastSender ! "finished"
      }