首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring Boot和Java 8的非阻塞REST

使用Spring Boot和Java 8的非阻塞REST
EN

Stack Overflow用户
提问于 2017-03-14 22:49:36
回答 2查看 10.5K关注 0票数 3

我需要帮助。

我的一个端点超时的问题给我带来了困扰。我对SQL和我正在使用的其他REST服务进行了一些性能调整,但它只有一点点帮助。我认为,这个问题的一个很好的解决方案是使用Spring Boot和Java 8的一些异步功能,并执行某种“即发即忘”操作。

我试过这样的东西,但它不好,“摇滚时间!”消息可以打印出来,但似乎根本没有调用getLyrics()方法!

代码语言:javascript
复制
    //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端点执行调用。所有这一切都需要时间,有时*会导致超时。我希望它在和平的情况下处理,如果可能,在可能的情况下返回某种响应。

我尝试了这个解决方案的几个变体,因为它似乎接近我需要的,但似乎不明白为什么它对我不起作用。

*经常

EN

回答 2

Stack Overflow用户

发布于 2017-03-15 13:16:38

我认为,春季期货必须等到操作完成。但是java可完成的未来更强大,也许你可以试一试。

代码语言:javascript
复制
Future<String> a = ...;

while(!a.isDone()){
}

这是一个示例。https://spring.io/guides/gs/async-method/

票数 0
EN

Stack Overflow用户

发布于 2017-11-28 04:23:05

您可以使用Spring的DefferedResult和Java8的Computable future来使您的控制器是非阻塞的,从而委托Comupatable Future的whenAsync method.Here中的长时间运行的任务就是一个有效的例子-- https://github.com/kazi-imran/TransactionStatistics

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42789204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档