我需要帮助。
我的一个端点超时问题让我很苦恼。 我对 SQL 和我正在使用的其他 REST 服务进行了一些性能调整,但它只有一点点帮助。 我想,这个问题的一个很好的解决方案是使用 Spring Boot 和 Java 8 的一些异步功能并执行某种“即发即弃”操作。
我试过类似的东西,但效果不佳,“是时候摇滚了!”消息可以正常打印出来,但似乎根本没有调用 getLyrics() 方法!
//MyController.java
@GET
@Path("na/na/na")
@Produces({"application/json"})
public Response getLyrics() {
final String lyrics = delegate.getLyrics();
return Response.ok().entity(lyrics.isEmpty()).build();
}
//MyDelegate.java
@Async("threadPoolTaskExecutor")
public Future<Boolean> getLyrics() {
LOG.info("Time to rock!");
final boolean result = lyricsService.getLyrics();
return new AsyncResult<Boolean>(result);
}
//MyAsyncConfig.java
@Configuration
@EnableAsync
public class MyAsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
return new ThreadPoolTaskExecutor();
}
}
因此,lyricsService.getLyrics()(由于某种原因未被调用)完成所有工作,调用其他服务,从 SQL 数据库中获取内容,并对其他一些 REST 端点执行调用。所有这些都需要时间,有时*会导致超时。我希望它能够平静地处理,如果可能的话,尽可能返回某种响应。
我尝试了此解决方案的几种变体,因为它似乎接近我的需要,但似乎无法理解为什么它不适合我。
*经常
最佳答案
我觉得,spring futures还得等操作完了。但是 java completable future 更强大也许你可以试试。
Future<String> a = ...;
while(!a.isDone()){
}
关于rest - 使用 Spring Boot 和 Java 8 的非阻塞 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789204/