Допустим, у меня определено будущее, как показано ниже:
import scala.concurrent.Future
def appendCharWithTimeout(transformationId: String, char: Char, delayTimeMs: Long, delayTimes: Int) = (s: String) => {
for (i <- 1 to delayTimes) {
println(s"$transformationId waiting iteration $i ...")
Thread.sleep(delayTimeMs)
}
s"$s$char"
}
Future("Hello ")
.map( appendCharWithTimeout("mapJ", 'J', 200, 5) )
.map( appendCharWithTimeout("mapO", 'o', 200, 5) )
.map( appendCharWithTimeout("mapH", 'h', 200, 5) )
.map( appendCharWithTimeout("mapN", 'n', 200, 5) )
.map( appendCharWithTimeout("map!", '!', 200, 5) )
Время выполнения этого будущего составляет 5 секунд (5 * 5 * 200 мс).
Я ищу способ обернуть это будущее в своего рода «контекст тайм-аута» и остановить выполнение по тайм-ауту, поэтому не все преобразования будут выполнены.
В идеале я предполагаюесть что-то вроде этого:
Future("Hello ")
.within(2 seconds)
.map( appendCharWithTimeout("mapJ", 'J', 200, 5) )
.map( appendCharWithTimeout("mapO", 'o', 200, 5) )
.map( appendCharWithTimeout("mapH", 'h', 200, 5) )
.map( appendCharWithTimeout("mapN", 'n', 200, 5) )
.map( appendCharWithTimeout("map!", '!', 200, 5) )
И вывод должен быть:
mapJ waiting iteration 1 ...
mapJ waiting iteration 2 ...
mapJ waiting iteration 3 ...
mapJ waiting iteration 4 ...
mapJ waiting iteration 5 ...
mapO waiting iteration 1 ...
mapO waiting iteration 2 ...
mapO waiting iteration 3 ...
mapO waiting iteration 4 ...
mapO waiting iteration 5 ...