如何在SpringBoot中使端点初始化异步?

fd3cxomn  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(358)

在我的spring boot项目中,几个restapi端点需要一个初始化需要几分钟的类。因此,启动restapi需要几分钟。
有没有可能(使用spring boot)使这几个端点异步初始化,即立即初始化所有其他端点,restapi开始工作,并且每当需要的类被初始化并且在此之前用户根本不可用时,这些端点就被初始化?
我试着调查 @Async 和其他方法,使事情异步在 Spring 启动,但这并没有帮助。我非常感谢你的帮助。谢谢您!

tuwxkamq

tuwxkamq1#

尝试 @Lazy 注解。当它应用于spring组件时,它将在第一次调用时初始化。
一些资源:
https://www.baeldung.com/spring-lazy-annotation
java文档

wtzytmuj

wtzytmuj2#

spring中没有内置任何东西可以做您想做的事情,但是您可以自己实现它,在服务初始化时返回404notfound响应,在服务可用时返回200ok。以下是一种实现方法:

@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 或者类似的。这将取决于应用程序的其余部分以及它如何处理线程。

相关问题