我正在将 Akka 集成到现有软件中,主要是为了在不应该同步的地方使事情异步。
我有一个正在进行一些数据库调用的服务,目前,一切都是同步的,调用线程只是坐在这里等待结果......
我的想法是替换 DAO 接口以将Future<T>
(Akka)作为结果而不是实际结果类型,因此,我的 DAO 实现实际上是在消息中转换这些调用并将它们路由到适当的参与者(本地和/或远程)。
Future<T>
现在当我打电话给演员时如何返回a时,我有点困惑。除了使用还有其他方法Patterns.ask()
吗?它是性能方面的最佳解决方案(无需使用演员重写所有内容)吗?
使用Patterns.ask()
,如何在不等待超时的情况下返回错误?如果我调用的演员只是简单地告诉错误,当我想触发失败时,它会触发成功。
编辑
我正在使用 Java。
现在,我想出了一个类似下面的构造,但是,这意味着我的演员必须tell()
将异常返回给发送者。
final Future<Object> f = Patterns.ask(..., ..., ...);
f.flatMap(new Mapper<Object, Future<List<Element>>>() {
public Future<List<Element>> apply(Object response) {
if (response instanceof SuccessfulResult) {
return Futures.successful(response, f.executor());
} else if (response instanceof Throwable) {
return Futures.failed((Throwable) response, f.executor());
} else {
return Futures.failed(..., f.executor());
}
}