我正在将Akka集成到一个现有的软件中,主要是为了使它们不同步而异步。
我有一个正在进行数据库调用的服务,此刻,一切都是同步的,调用线程只是坐在这里等待结果......
我的想法是替换DAO接口以使Future<T>
(Akka's)作为结果而不是实际结果类型,因此,我的DAO实现实际上是在消息中转换这些调用并将它们路由到适当的actor(本地和/或远程)。
现在,当我打电话给演员时,我对于如何返回Future<T>
感到有些困惑。除了使用Patterns.ask()
之外,还有其他方法吗?这是性能方面的最佳解决方案(不使用演员重写所有内容)吗?
使用Patterns.ask()
,如何在不等待超时的情况下返回错误?如果我调用的actor只是告诉错误,那么当我想触发失败时,它会触发成功。
编辑
我正在使用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());
}
}
答案 0 :(得分:0)
要区分成功或失败,请使用scala.Either。所以答案类型看起来像这样:
type Result = Future[Either[SQLException, MyDataType]]