【问题标题】:From java.util.concurrent.Future<T> to play.libs.F.Promise<T>: How to do that in Java?从 java.util.concurrent.Future<T> 到 play.libs.F.Promise<T>:如何在 Java 中做到这一点?
【发布时间】:2013-08-16 07:31:25
【问题描述】:

我正在使用播放框架来实现 REST API 服务。

在一个函数中,我使用 java 异步库与另一个服务通信,它返回一个 java.util.concurrent.Future&lt;T&gt; 我将(使用 Guava Futures.transform(~))映射到 java.util.concurrent.Future&lt;play.mvc.Result&gt;

现在,如何将其设为 play.libs.F.Promise&lt;Result&gt; 以便我可以创建 AsyncResult

我找到了play.libs.Akka.asPromise(scala.concurrent.Future&lt;T&gt; future),但我找不到一种方法(在 Java 中)从 Java 中获得 Scala 未来。

编辑临时解决方案: 这是我现在使用的:

Future<T> future = asyncGetTheFuture();
Promise<T> promise = Akka.future(new JFutureToPromise<T>(tempFuture));

    class JFutureToPromise<T> implements Callable<T> {
        final Future<T> future;
        final long time;
        final TimeUnit unit;

        private JFutureToPromise(Future<T> future, long time, TimeUnit unit) {
            this.future = future;
            this.time = time;
            this.unit = unit;
        }

        private JFutureToPromise(Future<T> future) {
            this(future, 10L, TimeUnit.SECONDS);
        }

        @Override
        public T call() throws Exception {
            return future.get(time, unit);  
        }
    }

【问题讨论】:

    标签: java asynchronous playframework akka


    【解决方案1】:

    没有办法非阻塞/非轮询将任意 j.u.c.Future 转换为异步 Future/Promise。 试试看,自己看看:)

    【讨论】:

    • 我试过了,只是Promise在扩展j.u.c.Future……所以我有希望。
    • 那个方向很简单; Promise/Future 比 j.u.c.Future 更强大/更灵活
    • 如果只有 Java 的 Future 支持这个概念,如果一个完成侦听器(观察者),那么您就可以通过 Promise 在 Java 的 Future 和 Scala 的 Future 之间建立一座桥梁,但可惜这样的事情不存在......
    • 幸运的是,我亲爱的朋友 Doug 将来可能会在那里提供帮助(请原谅我的双关语):download.java.net/lambda/b103/docs/api/java/util/concurrent/…
    • 哇!现在这就是我要说的:)
    猜你喜欢
    • 2016-06-24
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多