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

标签 rest asynchronous spring-boot java-8 nonblocking

我需要帮助。

我的一个端点超时问题让我很苦恼。 我对 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()){
}

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

关于rest - 使用 Spring Boot 和 Java 8 的非阻塞 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789204/

相关文章:

c# - 在 REST Web Api 上获取 Windows 登录用户

rest - 如何做 WCF REST 缓存?

c# - Xamarin iOS 同步运行具有返回值的任务

spring - SpringBoot-微服务的Docker化+ Angular + MySQL + RabbitMQ

java - Spring Boot 和 OVal 上的验证问题

java - 在java中发送邮件需要太多时间,我该如何克服这个问题

oracle - 如何在没有可用行选择器的情况下为 APEX 21.1 REST 数据源设置数据配置文件

rest - 在 REST 端点中遗漏当前用户 ID 是不好的做法吗?

ios - Swift:如何通过完成处理程序(闭​​包)的引用存储对象数组?

javascript - 由于未知原因,Dialogflow 代理不会在函数内说话