@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.
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
@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? –
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