【问题标题】:How to make endpoints initialization asynchronous in Spring Boot?如何在 Spring Boot 中使端点初始化异步?
【发布时间】:2021-05-24 18:56:42
【问题描述】:

在我的 Spring Boot 项目中,几个 REST API 端点需要一个初始化需要几分钟的类。因此,启动 REST API 需要几分钟时间。

是否有可能(使用 Spring Boot)使这几个端点异步初始化,即所有其他端点立即初始化并且 REST API 开始工作,并且只要它们需要的类被初始化并且简单地初始化这些端点在此之前对用户不可用?

我尝试研究 @Async 和其他在 Spring Boot 中使事情异步的方法,但这并没有帮助。 非常感谢您的帮助。

【问题讨论】:

  • “初始化需要几分钟的类”是Spring管理的bean吗?
  • @AndyWilkinson 不,它只是一个外部类,但我想它可以包装在一个 bean 中。

标签: java spring spring-boot rest asynchronous


【解决方案1】:

Spring 中没有内置任何东西来做你想做的事,但你可以通过在服务初始化时返回 404 Not Found 响应并在服务可用时返回 200 OK 来自己实现它。以下是一种实现方式:

@RestController
class ExampleController {
    
    private final Future<SlowInitializationService> service;
    
    ExampleController() {
        this.service = ForkJoinPool.commonPool().submit(SlowInitializationService::new);
    }
    
    @GetMapping
    ResponseEntity<Result> example() throws InterruptedException, ExecutionException {
        if (this.service.isDone()) {
            return new ResponseEntity<>(this.service.get().perform(), HttpStatus.OK);
        }
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
    

}

您可能想要注入 Executor 或类似的,而不是使用公共池。这将取决于您的应用程序的其余部分以及它如何处理线程。

【讨论】:

【解决方案2】:

试试@Lazy注解。当它应用于spring组件时,它会在第一次调用时被初始化。

一些资源:

【讨论】:

  • 但是组件不会自动初始化,只会在第一次调用后开始初始化。我正在寻找能够在 REST API 启动后自动启动组件初始化的东西,并且在初始化组件时,使用该组件的端点不可用,而所有其他端点都可用且正在工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多