我需要帮助。
我的一个端点超时的问题给我带来了困扰。我对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端点执行调用。所有这一切都需要时间,有时*会导致超时。我希望它在和平的情况下处理,如果可能,在可能的情况下返回某种响应。
我尝试了这个解决方案的几个变体,因为它似乎接近我需要的,但似乎不明白为什么它对我不起作用。
*经常
发布于 2017-03-15 13:16:38
我认为,春季期货必须等到操作完成。但是java可完成的未来更强大,也许你可以试一试。
Future<String> a = ...;
while(!a.isDone()){
}发布于 2017-11-28 04:23:05
您可以使用Spring的DefferedResult和Java8的Computable future来使您的控制器是非阻塞的,从而委托Comupatable Future的whenAsync method.Here中的长时间运行的任务就是一个有效的例子-- https://github.com/kazi-imran/TransactionStatistics
https://stackoverflow.com/questions/42789204
复制相似问题