Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长眠_Java_Spring_Spring Boot_Long Polling_Spring Rest - Fatal编程技术网

Java 长眠

Java 长眠,java,spring,spring-boot,long-polling,spring-rest,Java,Spring,Spring Boot,Long Polling,Spring Rest,在我的应用程序中,我需要实现一些功能,以确保若客户端发出GET请求,应用程序将保留该请求,直到数据库中发生某些更改,并且还可以设置最大保留时间。 例如: 用户发出GET请求,请求将保持20秒。若在这20秒内数据库中发生了变化,应用程序将使用所需数据发布此请求,否则应用程序将保留请求20秒 我决定使用长轮询。在我的应用程序中,我也使用Spring Boot。你能告诉我是否可以用Spring来做,或者我应该为它添加一些其他库吗 我还发现了将请求保留一段时间的方法,但问题是,带有参数的方法不允许使用s

在我的应用程序中,我需要实现一些功能,以确保若客户端发出GET请求,应用程序将保留该请求,直到数据库中发生某些更改,并且还可以设置最大保留时间。 例如:

用户发出GET请求,请求将保持20秒。若在这20秒内数据库中发生了变化,应用程序将使用所需数据发布此请求,否则应用程序将保留请求20秒

我决定使用长轮询。在我的应用程序中,我也使用Spring Boot。你能告诉我是否可以用Spring来做,或者我应该为它添加一些其他库吗

我还发现了将请求保留一段时间的方法,但问题是,带有参数的方法不允许使用scheluder,但我需要由特定用户获取数据,所以至少应该传递用户id。此外,我不确定是否可以在需要时手动释放此scheluder


谢谢你的建议

对于长拉请求,您可以使用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 pooling task;If task is not completed within 100 sec timeout response retrun 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;
}
@GetMapping(“/test”)
延迟结果测试(){
长时间输出毫秒=100000L;
字符串timeOutResp=“超时。”;
DeferredResult DeferredResult=新的DeferredResult(timeOutInMilliSec,timeOutResp);
CompletableFuture.runAsync(()->{
试一试{
//长池任务;如果任务未在100秒内完成,则超时响应重新运行此请求
时间单位。秒。睡眠(10);
//在完成任务后设置结果以将响应返回给客户端
deferredResult.setResult(“任务完成”);
}捕获(例外情况除外){
}
});
返回延迟结果;
}
在此请求中,等待10秒后给出响应。如果您等待超过100秒,您将得到超时响应


查看./P>您可能需要考虑SSE或WebSoCube,因此服务器在工作完成后通知客户端。由于长轮询增加了大量与HTTP相关的开销:通常由客户机(而不是服务器)决定等待服务器响应的时间,或者由于没有响应而断开连接,因此我不确定HTTP是否是您的情况下的正确协议then@RomanVottner那么您推荐什么协议?@Scheduled不用于处理请求。它就像应用程序的内部crontab功能一样,用于运行特殊工作,如清理u缓存或刷新OAuth令牌。