如何在 Spring Boot 应用程序中实现长轮询 REST 端点?

Posted

技术标签:

【中文标题】如何在 Spring Boot 应用程序中实现长轮询 REST 端点?【英文标题】:How to implement Long Polling REST endpoint in Spring Boot app? 【发布时间】:2019-05-10 21:18:31 【问题描述】:

您能否分享任何最新的手册或在这里解释如何使用最新的 Spring (Spring Boot) 实现 REST Long Polling 端点?

此时我发现的所有内容都已过时,并且是几年前发布的。

那么,我提出了一个问题,长轮询仍然是一种好方法吗?我知道它在 chess.com 中使用过

【问题讨论】:

【参考方案1】:

对于长轮询请求,您可以使用DeferredResult。当您返回DeferredResult 响应时,请求线程将空闲,请求将由工作线程处理。这是一个例子:

@GetMapping("/test")
DeferredResult<String> test()
    long timeOutInMilliSec = 100000L;
    String timeOutResp = "Time Out.";
    DeferredResult<String> deferredResult = new DeferredResult<>(timeOutInMilliSec, timeOutResp);
    CompletableFuture.runAsync(()->
        try 
            //Long polling task; if task is not completed within 100s, timeout response returned for this request
            TimeUnit.SECONDS.sleep(10);
            //set result after completing task to return response to client
            deferredResult.setResult("Task Finished");
        catch (Exception ex)
        
    );
    return deferredResult;

此请求演示在等待 10 秒后提供响应。如果你设置sleep(100)或更长,你会得到一个超时响应。

查看this 了解更多选项。

【讨论】:

以上是关于如何在 Spring Boot 应用程序中实现长轮询 REST 端点?的主要内容,如果未能解决你的问题,请参考以下文章

哪些选项可用于使用 SOAP 在 Delphi 中实现长轮询?

SignalR全套系列之在.Net Core 中实现长轮询

长轮询冻结浏览器并阻止其他 ajax 请求

如何在android中实现长按屏幕?

由于Airtest中long_click无法实现长按,教你如何在Airtest中实现长按的方法

如何在 Spring Boot 中实现刷新令牌