Kotlin Coroutines с таймаутом

В настоящее время я пишу тестовую функцию, которая должна запускать блок или (когда достигается определенный тайм-аут) выдает исключение.

Я пытался это сделать с Coroutines в Котлине, но в итоге получилось сочетание Coroutines и CompletableFuture :

 fun <T> runBlockWithTimeout(maxTimeout: Long, block: () -> T ): T { val future = CompletableFuture<T>() // runs the coroutine launch { block() } return future.get(maxTimeout, TimeUnit.MILLISECONDS) } 

Это работает, но я не уверен, что это намеченный способ решить эту проблему в котлине.

Я также пробовал другие подходы:

 runBlocking { withTimeout(maxTimeout) { block() } } 

Но это, похоже, не работает, как только block вызывает, например, Thread.sleep(...)

Так подходит ли CompletableFuture подход, или есть лучший?

обновление 1 Что я хочу достичь:

Асинхронный интеграционно-тестовый код (например, получение данных от RabbitMq) должен быть протестирован так:

 var rabbitResults: List = ... // are filled async via RabbitListeners ... waitMax(1000).toSucceed { assertThat(rabbitResults).hasSize(1) } waitMax(1000).toSucceed { assertThat(nextQueue).hasSize(3) } ... 

withTimeout { ... } предназначен для отмены текущей операции при тайм-ауте, что возможно только в том случае, если рассматриваемая операция отменяется .

Причина, по которой он работает с future.get(timeout, unit) заключается в том, что он только ждет с таймаутом. Это фактически не отменяет или не отменяет какой-либо фоновый режим, который по-прежнему продолжает выполняться по истечении времени ожидания.

Если вы хотите сопоставить аналогичное поведение с сопрограммами, вам следует подождать с тайм-аутом, например:

 val d = async { block() } // run the block code in background withTimeout(timeout, unit) { d.await() } // wait with timeout 

Он работает правильно, потому что await – это функция отмены, которую вы можете проверить, прочитав ее документацию по API .

Однако, если вы хотите фактически отменить текущую операцию в тайм-ауте, тогда вы должны реализовать свой код в асинхронном и отменяемом виде. Отмена является совместной , поэтому, чтобы начать, базовая библиотека, которую вы используете в своем коде, должна предоставить асинхронный API, который поддерживает отмену текущей работы.

Вы можете больше узнать об аннулировании и тайм-аутах в соответствующем разделе руководства по сопрограмме и посмотреть « Глубокое погружение» KotlinConf в Coroutines о том, как интегрировать сопрограммы с асинхронными библиотеками.

Intereting Posts
Chromecast – Cast Dialogue не имеет тени и не может отменить внешний контакт DBFlow: могу ли я удалить один из них с отключением списка? Котлин – вторичный конструктор, который отличается одним аргументом Уведомление Действие не срабатывает PendingIntent Какое правильное название для встроенной документации Kotlin? Как прочитать ряд элементов под дочерним узлом в Firebase с использованием FirebaseAdapter Задача сериализации класса данных класса Kotlin Экземпляр экземпляра Kotlin имеет значение null при доступе к Spring-классу Spring Отображение, если исключение java.lang.NoSuchMethodException: com … Сотрудник. <init> () Почему объекты объекта не работают с неизменяемыми свойствами в Android GSON – преобразование строки в JsonArray Цвет фона и перетасовка изображений в режиме прокрутки в recyclerView Android с помощью группового адаптера Метод выполнения объекта kotlin Как создавать функции с совместимыми параметрами / результатами в Котлине?