0

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

1 回答 1

0

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

type Result = Future[Either[SQLException, MyDataType]]
于 2012-05-24T07:33:59.210 回答