2013-08-14 7 views
5

Używam platformy odtwarzania do wdrożenia usługi REST API.Od java.util.concurrent.Future <T> do play.libs.F.Promise <T>: Jak to zrobić w Javie?

W jednej funkcji Używam asynchronicznej biblioteki Java, aby porozmawiać z inną usługę i zwraca java.util.concurrent.Future<T> że mapy (za pomocą Guava Futures.transform(~)) do java.util.concurrent.Future<play.mvc.Result>.

Jak to zrobić, aby uzyskać play.libs.F.Promise<Result>, dzięki czemu mogę wykonać AsyncResult?

Znalazłem play.libs.Akka.asPromise(scala.concurrent.Future<T> future), ale nie mogę znaleźć sposobu (w Javie), aby uzyskać przyszłość scala od java.

EDIT rozwiązanie tymczasowe: Oto co używam teraz:

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

z

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); 
     } 
    } 

Odpowiedz

5

Nie ma sposobu, aby nie blockingly/non-pollingly przekształcić dowolną jucFuture w asynchroniczną przyszłość/obietnicę. Wypróbuj i przekonaj się sam :)

+0

Próbowałem, to tylko, że Promise rozszerza j.u.c.Future ... więc miałem nadzieję. –

+0

Ten kierunek jest bardzo prosty; Obietnica/Przyszłość jest silniejsza/bardziej elastyczna niż jucFuture –

+0

Jeśli tylko Java's Future wspierałaby koncepcję, jeśli słuchacz ukończenia (obserwator), to będziesz w stanie stworzyć most między Future'em Javy i Future Scala przez obietnicę, ale niestety takie rzeczy nie istnieje ... – cmbaxter

Powiązane problemy