【问题标题】:How to get Futures of actor invocation in a non-actor context如何在非参与者上下文中获取参与者调用的期货
【发布时间】:2012-05-24 03:30:03
【问题描述】:

我正在将 Akka 集成到现有软件中,主要是为了在不应该同步的地方使事情异步。

我有一个服务正在进行一些数据库调用,此刻,一切都是同步的,调用线程只是坐在这里等待结果......

我的想法是替换 DAO 接口以将 Future<T>(Akka 的)作为结果而不是实际的结果类型,因此,我的 DAO 实现实际上是在将这些调用转换为消息并将它们路由到适当的参与者(本地和/或远程)。

现在当我打电话给演员时,当谈到如何返回Future<T> 时,我有点困惑。除了使用 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());
    }
}

【问题讨论】:

    标签: java akka future


    【解决方案1】:

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

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

    【讨论】:

    • 我正在使用Java,但我想这并不重要......在你的情况下,如果我返回SQLExceptionFuture&lt;T&gt; 将调用onFailure(),我应该简单地把 Exception 扔到我的演员身上?
    • 文档是一个很好的起点:doc.akka.io/docs/akka/2.0.1/java/…
    • 感谢 Viktor 的指点,之前没有注意到 Failure。如果这是在演员上下文中完成的,会发生什么?调用者会收到Failure 作为正常消息,对吧?
    猜你喜欢
    • 2011-03-24
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2017-04-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多