Как сделать моно тайм-аут работает - PullRequest
0 голосов
/ 23 января 2019

Я первый, кто использовал webflux в моем проекте, просто хочу установить тайм-аут в случае длинного дескриптора.

@GetMapping("/{id}")
private Mono<ResponseEntity<String>> getEmployeeById(@PathVariable 
String id) {
    return Mono.just(id).map(updateTweet -> {
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<>(updateTweet, HttpStatus.OK);
    }).timeout(Duration.ofSeconds(3)).onErrorReturn(new ResponseEntity<>("0000", HttpStatus.OK));

}

Ожидайте: через 3 секунды эта функция вернется.фактические результаты: через 10 секунд эта функция вернулась.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

В вашем коде .map и .timeout все в ветке подписки. .sleep(10) приводит к тому, что текущий исполняемый поток находится в спящем режиме (временно прекращает выполнение) для 10s. Поэтому, когда 3s тайм-аут, поток не может быть выполнен.

Вы должны использовать publishOn shift .map для потока планировщика.

@GetMapping("/{id}")
private Mono<ResponseEntity<String>> getEmployeeById(@PathVariable 
String id) {
    Scheduler singleThread = Schedulers.single();
    return Mono.just(id).publishOn(singleThread).map(updateTweet -> {
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<>(updateTweet, HttpStatus.OK);
    }).timeout(Duration.ofSeconds(3)).onErrorReturn(new ResponseEntity<>("0000", HttpStatus.OK));

}
0 голосов
/ 24 января 2019

То, что делает TimeUnit.SECONDS.sleep(10), вызывает Thread.sleep().Это переводит текущий поток в спящий режим на 10 секунд.

Поскольку вы делаете это внутри map, текущий поток переходит в спящий режим.Код, ожидающий timeOut, также находится в текущем потоке и не вступает в силу до истечения времени ожидания sleep.По этой причине вам следует избегать выполнения любых операций, связанных с Thread, при выполнении реактивного программирования.

Если вы хотите смоделировать длительный процесс в приведенном выше коде, вы можете либо вызвать внешний API, который вы контролируете, чтождет более 3 секунд, прежде чем отправить ответ, или использовать один из операторов delay*.

...