如何在非actor的上下文中获取actor调用的Futures

时间:2012-05-24 03:30:04

标签: java akka future

我正在将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());
    }
}

1 个答案:

答案 0 :(得分:0)

要区分成功或失败,请使用scala.Either。所以答案类型看起来像这样:

type Result = Future[Either[SQLException, MyDataType]]