用akka告诉,当actor执行逻辑并获取异常时,执行任务的线程将发生什么情况

时间:2019-04-25 18:51:55

标签: java akka playback

我有一个演员与数据库连接。当从控制器中调用actor时,将其激活并忘记模型时,我们选择了tell方法而不是ask。当执行数据库操作时出现问题时,我们得到了例外。我们不会捕获异常或在此处进行严格的错误处理。那么,在这种情况下,与数据库的连接由于异常突然退出而会发生什么?将其丢弃或仍然挂起并创建罢工的线程。请指教。

在使用tell方法在Akka中调用Actor来处理数据库时,忽略错误处理也是明智的选择。

1 个答案:

答案 0 :(得分:0)

让它暗恋是Akka Actor的主要原则之一。因此,actor得到一个异常是可以的,默认情况下它将由其主管重新启动。您可以在Akka的文档fault-tolerance-akka中找到有关容错的更多信息 因此,当有例外时,这是解决此问题的两种快速解决方案:

  1. 从控制器重试策略:不要使用ask,而是在没有异常的情况下通知主管何时执行了DB操作。监督者,在这种情况下,是控制器,可以在缓冲区中跟踪了参与者已被请求给参与者的写入操作。当控制器从actor接收到OK时,它可以将其从缓冲区中删除,在另一种情况下,如果超时未收到响应,则即使actor因异常而崩溃,也可以重试(actor的mailRef将为相同的角色将重新启动。)
  2. **管理例外情况**:您可以管理例外情况,并在演员被击溃后在主管中进行处理,具体取决于例外情况,您可以定义要执行的动作。

我更喜欢第一种选择,但是火灾和遗忘模型始终存在这种风险。另一种更难实现的选择是向参与者添加持久性并将消息记录为事件。在这种情况下,actor将获得暗恋后重试操作所需的信息。