【问题标题】:How to Querying Db certain seconds untill get result in spring boot如何在 Spring Boot 中查询 Db 几秒钟直到得到结果
【发布时间】:2021-07-24 07:32:59
【问题描述】:

我想调用 repository.findbyId(id) 直到在几秒钟内得到结果。

例如:选择 id =1 连续 25 秒的员工详细信息。如果我们在第 15 秒得到结果,我们必须停止调用。

我尝试使用 @Retryable,但它不适合我的情况。

我们可以通过 Awaitility.await().atMost(20, TimeUnit.SECONDS).pollInterval(50, TimeUnit.MILLISECONDS) 来实现 .untilAsserted()}

但是,我们只能使用 Awaitility 来测试断言。 Spring Boot 中是否有任何其他选项可以替代 Awaitility?

【问题讨论】:

  • 为什么你不能使用Awaitility?我刚刚为我的 Boot 应用程序部署了一个更新,将其拉入运行时。
  • 这是一个非常奇怪的用例。 2 秒在 Cassandra 中是永恒的。我真的很好奇你为什么需要等待。也许如果您提供有关您要解决的问题的一些背景知识,我们也许可以给出更好的答案。干杯!
  • @chrylis 根据代码标准,Awaitility 仅用于测试目的。开发方面我们需要找到一些替代方案

标签: java spring spring-boot cassandra spring-data-jpa


【解决方案1】:

spring-retry 应该有你需要的一切。即使带有@Retryable 的基于注解的API 不适合,spring-retry 也有带有RetryTemplate (https://www.baeldung.com/spring-retry#retrytemplate) 的编程重试,其中可以配置每个细节。

您也可以自己编写重试机制。根据您的描述,您只需要一个带有Thread.sleep() 和一些计时器/计数器的循环。 Awaitility 和 spring-retry 也只使用Thread.sleep(),但看起来要复杂得多,因为它们的可配置性非常高(您不需要)。

【讨论】:

  • 根据我们的编码标准,我们不应该使用 Thread.sleep(1000);
  • 看看 Awaitility 和 spring-retry 代码,你会看到 Thread.sleeps。我知道的其他客户端(非反应性)也使用 Thread.sleep,例如 Feign:github.com/OpenFeign/feign/blob/master/core/src/main/java/feign/… 如果你不想睡觉,那么你需要实现一个计时器和某种等待/通知系统。为此,我没有为您准备好答案/解决方案。
  • 一个需要澄清的问题:您是否不允许专门使用 Thread.sleep,或者您通常不允许更长时间地阻塞线程?
猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2016-02-21
  • 2021-09-25
相关资源
最近更新 更多