gpt4 book ai didi

java - 限制调用 Spring Boot Rest 端点,直到完成从数据库的映射

转载 作者:行者123 更新时间:2023-12-02 08:44:10 25 4
gpt4 key购买 nike

我有 Spring Web 应用程序,我需要创建缓存并将数据库中的值放入其中,然后才能允许任何休息调用。

对数据库的查询可以执行 8 分钟,我使用 EventListener 执行它们

@Override
@EventListener(ApplicationReadyEvent.class)
public void getValuesFromDB() {
loaderService.getValuesFromDBToCache();
}

问题是我需要在创建上下文和创建缓存时执行此操作,因此无法在 PostConstruct 中执行此操作。

如何在 loaderService.getValuesFromDBToCache() 时限制端点上的接收调用;正在工作吗?

最佳答案

我认为这种8分钟不允许API调用的做法并不是一个好办法。如果可能的话,您应该尝试将其更改为延迟加载。

如果您想以某种特定的延迟或直到缓存完成加载的时间来执行此操作,一种方法是使用如下给出的代码拦截调用,

public class SampleInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

String theMethod = request.getMethod();

if (checkIsCacheProcessingDone()) {

return true;
}
else {
//not allowed
response.sendError(HttpStatus.METHOD_NOT_ALLOWED.value());
return false;
}
}

private boolean checkIsCacheProcessingDone(){
//a boolean should be created in cache or where ever you prefer which is accessible from this context and check if that value is true or not
}

现在使用下面的代码注册它,

@Configuration
public class SampleConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SampleInterceptor()).addPathPatterns(yourPath);
}
}

这肯定会带来一些性能开销,因为无论缓存是否完成,每个 API 调用都会处理此问题。我绝对不会这样做,而是会在运行时延迟加载缓存。

除非您确定要阻止用户,否则不要走这条路。

编辑================================================ =================

我想到的另一种方法是,创建一个没有网络的应用程序上下文,然后填充缓存(我希望您使用像 redis 等这样的外部缓存,而不是在内存中),一旦完成,数据库读取完成,重新启动应用程序。示例如下代码所示,

ConfigurableApplicationContext configurableApplicationContext = SpringApplicationBuilder(OmsBasketApiApplication.class).web(
WebApplicationType.NONE).run(args);

try {
addToredis(configurableApplicationContext);
} catch (Exception exception){
//do something else? System.exit(1)?
} finally {
configurableApplicationContext.close();
}

configurableApplicationContext = SpringApplicationBuilder(OmsBasketApiApplication.class).run(args);

希望这有帮助

关于java - 限制调用 Spring Boot Rest 端点,直到完成从数据库的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61192397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com