2017-04-13 2 views
0

J'ai dû placer une requête HTTP de répartition dans un autre Future car il semble que la connexion réseau initiale puisse bloquer (dans Netty ou quoi que ce soit derrière Par exemple, lorsque l'ordinateur est uniquement connecté à un autre ordinateur avec une adresse IP statique et pas de DNS, les blocs système pendant dix secondes ou plus avant que le futur ne soit réellement créé). Ainsi, au lieu deCorriger la façon de bloquer le code qui bloque avant d'émettre un futur dans un autre futur

Http(req.OK(JsonUTF)) 

J'ai maintenant

Future { 
    blocking(
    Http(req.OK(JsonUTF)) 
) 
} .flatMap(identity) 

Est-ce exact? Y at-il un inconvénient de flatMap(identity) sur flatten, qui est seulement dans Scala 2.12 et utilise un "exécuteur interne"?

Ou devrais-je utiliser

Future { 
    val jsonFut = blocking(
    Http(req.OK(JsonUTF)) 
) 
    Await.result(jsonFut, Duration.Inf) 
} 

?

Répondre

0

Vous pouvez vous en sortir avec une seule invocation flatMap si vous faites quelque chose comme ceci:

Future.successful(()).flatMap(_ => blocking { Http(req.OK(JsonUTF)) })

// Vous pouvez, sur Scala 2.12, remplacer Future.successful (()) avec Future.UNIT

+0

Est-ce que 'Future.successful (()). FlatMap (x)' est différent de 'Future (x) .flatMap (identity)'? –

+0

Oui. Future.apply (x) est synthétiquement équivalent à Future.successful (()). Map (_ => x) –

+0

Future (x) .flatMap (identité) est comme suit: Future.successful (()). Map (_ => x) .flatMap (identité). Et ce que vous voulez, c'est Future.successful (()). FlatMap (_ => x) –