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

问题描述 投票:1回答:2

我需要帮助。

我的一个终点超时的问题让我感到苦恼。我使用SQL和我正在使用的其他REST服务进行了一些性能调整,但它只是有点帮助。不过,对于这个问题,一个很好的解决方案是使用Spring Boot和Java 8的一些Async功能,并执行某种“Fire and forget”操作。

我尝试了类似的东西,但这并不好,“时间摇滚!”消息被打印出来,但似乎根本没有调用Lyrics()方法!

    //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端点执行调用。所有这些都需要时间,有时*导致超时。我希望它能够和平地进行,如果可能的话,尽可能地回复某种回应。

我尝试了这个解决方案的几种变体,因为它似乎接近我需要的东西,但似乎无法理解为什么它不适合我。

*经常

rest asynchronous spring-boot java-8 nonblocking
2个回答
0
投票

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

Future<String> a = ...;

while(!a.isDone()){
}

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


0
投票

你可以使用Spring的DefferedResult,以及Java8的Computable future来使你的控制器无阻塞,从而在Comupatable Future的whenAsync方法中委托长期运行的tak.Here是一个工作的例子 - https://github.com/kazi-imran/TransactionStatistics

© www.soinside.com 2019 - 2024. All rights reserved.