【发布时间】:2016-02-15 13:04:06
【问题描述】:
最近我一直在研究令人敬畏的 Akka 框架,试图了解它并确定它是否适合我的项目。目前,这个应用程序是一个普通的老式 java 应用程序,它通过调用各种外部 c++ 可执行文件来执行一些非常复杂的计算(有时计算可能需要几个小时才能运行)。在代码中它看起来像这样
public static class Worker extends UntypedActor {
// Run Very Long Process
public void onReceive(Object message) {
if (message instanceof Work) {
Work work = (Work) message;
double result = veryLongProcess(work.getStart(),work.getNrOfElements());
getSender().tell(new Result(result), getSelf());
} else {
unhandled(message);
}
}
}
我的问题是,Akka 能否处理有时需要数小时才能从执行中返回的演员?
【问题讨论】:
-
您可以将调度程序配置为适合您的应用程序的线程模型。您可能希望为运行缓慢任务的调度程序设置一个单独的线程池,并为其他执行短期任务的参与者保留默认调度程序。 doc.akka.io/docs/akka/snapshot/scala/dispatchers.html 在使用如此丰富的框架以了解所有可配置部分时,阅读所有文档是个好主意。
-
好的,这很有道理。我想我担心的是 Akka 有某种超时或其他类似的功能,在经过一定时间后会假设演员已经死亡。
-
根据我的经验,工作只是在actor邮箱中存储,直到你用完堆或线程。所以资源管理是你必须在 else configure 中设计的东西。简单的事情是简单的,复杂的事情是可能的。我最重要的建议是不要让一切都成为演员。 Futures 也是你的朋友,并且只使用演员来使多任务处理和远程处理更容易。