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

17
请问您能否分享最新的手册或在此说明如何使用最新的Spring(Spring Boot)实现REST长轮询端点?
到目前为止,我找到的所有资料都相当过时,大多数是几年前发布的。
因此,我想问一下,长轮询是否仍然是一个好方法?我知道它在chess.com中使用过。
1个回答

24

对于长轮询请求,您可以使用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)或更长时间,你将得到一个超时的响应。

查看这里以获取更多选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接