Vous n'obtenez un comportement de dépassement de délai que si vous utilisez le blocage pour obtenir les résultats de la méthode Future
. Si vous voulez utiliser les callbacks non bloquants onComplete
, onSuccess
o onFailure
vous devrez alors mettre en place votre propre gestion des délais d'attente. Akka a intégré la gestion des délais d'attente pour les requêtes/réponses ( ?
) entre acteurs, mais vous n'êtes pas certain de vouloir commencer à utiliser Akka. FWIW, dans Akka, pour la gestion du timeout, ils composent deux Futures
ensemble via Future.firstCompletedOf
L'un représente la tâche asynchrone actuelle et l'autre le délai d'attente. Si le délai d'attente (via un HashedWheelTimer
) pops d'abord, vous obtenez un échec sur le callback asynchrone.
Un exemple très simplifié de l'utilisation d'un rouleau de papier pourrait ressembler à ceci. Tout d'abord, un objet pour planifier les délais d'attente :
import org.jboss.netty.util.{HashedWheelTimer, TimerTask, Timeout}
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.Duration
import scala.concurrent.Promise
import java.util.concurrent.TimeoutException
object TimeoutScheduler{
val timer = new HashedWheelTimer(10, TimeUnit.MILLISECONDS)
def scheduleTimeout(promise:Promise[_], after:Duration) = {
timer.newTimeout(new TimerTask{
def run(timeout:Timeout){
promise.failure(new TimeoutException("Operation timed out after " + after.toMillis + " millis"))
}
}, after.toNanos, TimeUnit.NANOSECONDS)
}
}
Puis une fonction pour prendre un futur et lui ajouter un comportement de temporisation :
import scala.concurrent.{Future, ExecutionContext, Promise}
import scala.concurrent.duration.Duration
def withTimeout[T](fut:Future[T])(implicit ec:ExecutionContext, after:Duration) = {
val prom = Promise[T]()
val timeout = TimeoutScheduler.scheduleTimeout(prom, after)
val combinedFut = Future.firstCompletedOf(List(fut, prom.future))
fut onComplete{case result => timeout.cancel()}
combinedFut
}
Notez que le HashedWheelTimer
J'utilise ici est de Netty.
0 votes
Voir awaitAll
4 votes
Gardez à l'esprit qu'aucune de ces solutions n'arrêtera réellement l'épidémie.
Future
de la course. Le seul endroit où vous pouvez arrêter unFuture
est de l'intérieur.1 votes
@NikitaVolkov Votre lien ne fonctionne plus. J'ai essayé de trouver le lien correct mais j'ai échoué.