如何在 Spring Boot 应用程序中实现长轮询 REST 端点?
How to implement Long Polling REST endpoint in Spring Boot app?
您能否分享任何最新手册或在此处解释如何使用最新的 Spring(Spring 引导)实现 REST 长轮询端点?
此时我发现的所有内容都已经过时并且是几年前发布的。
所以,我提出了一个问题,长轮询是否仍然是一种好方法?我知道它用于 chess.com
对于长轮询请求,可以使用DeferredResult
。当您 return 一个 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(Spring 引导)实现 REST 长轮询端点?
此时我发现的所有内容都已经过时并且是几年前发布的。
所以,我提出了一个问题,长轮询是否仍然是一种好方法?我知道它用于 chess.com
对于长轮询请求,可以使用DeferredResult
。当您 return 一个 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 以获得更多选项。