【发布时间】:2014-01-26 10:10:03
【问题描述】:
我在使用 java 的 akka 中使用主从架构。主站接收表示他路由到从站的作业命令的消息。这些工作涉及调用非开源的第三方库,有时仅通过挂起和阻止执行而崩溃而不抛出任何异常。 Akka 不会将此视为失败并继续向此 actor 正在使用的邮箱发送消息,但由于第一次调用无限期阻塞,邮箱中的其余命令将永远不会被执行。
我的目标是用超时到期和异常来模拟这种类型的故障,以便将整个事件转发到 akka 中的故障策略构建。所以我的问题是,我能否以某种方式配置一个actor在收到消息后抛出异常,并且在超时后它的执行没有完成?
如果不是,还有哪些其他方法可以在不执行任何阻塞操作的情况下处理这种情况?我正在考虑将执行封装在 Future 中,并从一个将阻塞该 Future 超时的actor内部调用它。它可以工作,但正如许多人所建议的那样,阻塞在 akka 中并不是一个好的解决方案。
【问题讨论】:
-
在您的问题中让我担心的是您的第三方 API 只是挂起和阻塞。发生这种情况时,来自
ExecutionContext的线程基本上也将被阻止。这种情况发生的次数已经够多了,你最终会削弱你的ExecutionContext,让演员系统的其余部分挨饿。如果您决定使用 future,请确保它们使用与您的 actor 系统不同的ExecutionContext以屏蔽此有问题的代码。