2012-07-17 14 views
13

Bir Play Framework 2.0.1 (Scala) uygulamasında, yanıt olarak java.util.concurrent.Future döndüren bir web hizmeti istemci kitaplığı kullanıyoruz.Bir java.util.concurrent.Future'ı bir Akka Geleceğine nasıl koyarım?

yerine get() çağrı Play uygulamasını engelleme, biz kolayca oyun çerçevenin AsyncResult işlem kullanabilirsiniz, böylece bir akka.dispatch.Future içinde j.u.c.Future sarmak istiyorum.

kimse daha önce yapmış ya da bir kitaplık veya örnek kodu var mı? Sahip olduğunuz tüm düz jucFuture oluşturmak yapabildiğinin en iyisi ise ... https://groups.google.com/forum/#!topic/play-framework/c4DOOtGF50c

:


GÜNCELLEME: saptadığımız en yakın şey bu google grupları tartışma bloke edici olmayan bir çözüm, jucFuture ve Promise'ı almak ve bunları, yapıldığında Gelecek'in sonucuyla birlikte, Promise'u tamamlayacak bir yoklama döngüsü yürüten bir parçacığa vermektir.

Bunun bir örneği var mı?

cevap

7

@Viktor Klang: j.u.c.Future'un bir iğrenç olduğunu anlıyoruz. Ama bu, şu anda olduğu gibi kabul etmemiz gereken bir yazılım parçasından geri dönüyoruz.

Şimdiye kadar, bu birlikte saldırıya budur: Başka bir deyişle

def wrapJavaFutureInAkkaFuture[T](javaFuture: java.util.concurrent.Future[T], maybeTimeout: Option[Duration] = None)(implicit system: ActorSystem): akka.dispatch.Future[T] = { 
    val promise = new akka.dispatch.DefaultPromise[T] 
    pollJavaFutureUntilDoneOrCancelled(javaFuture, promise, maybeTimeout.map(_.fromNow)) 
    promise 
} 

, j.u.c.Future tekabül ayrı Akka Promise (a Future yazma tarafı) oluşturmak, geri arama başladı pollJavaFutureUntilDoneOrCancelled, “abomination” ı sorgulayarak Promise'ı güncellemek ve Promise'ı arayan kişiye iade etmek.

Peki bunu biz "anket" j.u.c.Future durumuna dayalı Akka Promise güncellemek için?

def pollJavaFutureUntilDoneOrCancelled[T](javaFuture: java.util.concurrent.Future[T], promise: akka.dispatch.Promise[T], maybeDeadline: Option[Deadline] = None)(implicit system: ActorSystem) { 
    if (maybeDeadline.exists(_.isOverdue)) javaFuture.cancel(true); 

    if (javaFuture.isDone || javaFuture.isCancelled) { 
    promise.complete(allCatch either { javaFuture.get }) 
    } else { 
    Play.maybeApplication.foreach { implicit app => 
     system.scheduler.scheduleOnce(50 milliseconds) { 
     pollJavaFutureUntilDoneOrCancelled(javaFuture, promise, maybeDeadline) 
     } 
    } 
    } 
} 

Bu

Söz başvurulan google grupları tartışmada ima ne de bir girişimdir. J.u.c.Future öğesinin tamamlandığını veya iptal edildiğini kontrol etmek için her 50 ms'de bir geri çağırmak için Akka zamanlayıcısını kullanır. Ne zaman olursa olsun, Akka Sözünü tamamlanmış devletle günceller.

@Victor Klang, vd:

bu en iyi yöntem var mı? Bunu yapmanın daha iyi bir yolunu biliyor musun? Bilmemiz gereken bir dezavantajı mı kaçırıyoruz?

Daha fazla yardım için teşekkürler.

+0

Bariz olumsuz olduğunu en kötü durumda bu yanıtın yüksek gecikmeye neden olacağı. Örneğin varsayılan ayarlara sahip ve gelecekteki kontrolünden sonra 1 ms tamamlanırsa, yaklaşık 100 ms bir gecikmeye neden olabilir. Ancak bu, zamanlayıcının ayarlanmasıyla ayarlanabilir.yapılandırmada tick-duration 'ayarı. – drexin

+0

@drexin true, ancak herhangi bir yoklama tabanlı çözümde bir kene süresi ve anket sıklığı alım satımı mevcut olacak, değil mi? –

+1

Elbette, ama downsides için istediğim gibi sadece söylemek istedim, bu sadece 'programOnce 'çağrı gecikme paramına değil, aynı zamanda akka config ayarında bağlıdır. Bir gecikme ile yaşayabiliyorsanız, bu kullanılabilir bir çözüm olmalıdır. – drexin

0

Sen java.util.concurrent.Callable ile akka.dispatch.Futures.future() kullanmalıdır:

val akkaFuture: akka.dispatch.Future[String] = akka.dispatch.Futures.future(
    new java.util.concurrent.Callable[String] { 
    def call: String = { 
     return "scala->" + javaFuture.get 
    } 
}, executionContext) 

Gist for complete example

+0

Bu temelde gerekli olandan daha fazla iş parçacığıyla sonuçlanır, hangi bloklardan biri ve basitçe ana iş parçacığı üzerinde javaFuture.get çağrısından daha iyi değildir. Bileşen uyumluluğunun kesinlikle gerekli olduğu aşırı durumlar haricinde, akka geleceğine giriş yapmak yararlı değildir. – vishr