这种情况,假设我有和端点并接收一个请求,该请求在一定时间范围或其他时间之间检索数据,该请求的结果是我从数据库中获得的一个大列表,假设一个"Person"对象的列表,然后对于每个这个人对象,我必须调用另一个方法,它可能有点慢,它会延迟响应很多,如果我必须等到它为这个大列表的所有元素执行。
我想完成的是,我可以通过 rest 端点流式传输响应,并且我的前端不必等到处理完所有这些列表后才开始在屏幕上显示它。
所以我在这里有一个困惑,我知道使用 spring 的异步方法@Async即使任务仍未完成,它也会使消费者能够给出响应,但据我了解,这在发送电子邮件或任何其他任务或一系列任务的情况下很有帮助,您的响应不会显示在屏幕上。
但是对于要在屏幕中显示的响应,我想我应该在准备好整个"人"对象后立即流式传输大量数据。
实现此目的的正确方法是什么? 在这种情况下,异步方法是否有任何帮助,或者我应该只找到一种方法来检测何时形成了一个 Person 对象来流式传输它? 或者我大错特错了,我不理解异步和流媒体的概念。
一个小例子会有所帮助。
谢谢。
在过去的 3 天里,我一直在尝试理解相同的概念,这是我的理解,可能会对您有所帮助。
异步 REST 终结点:
如果您的 REST 端点正在执行一些复杂的业务逻辑或调用某些外部服务,并且可能需要一些时间才能响应,则最好尽快从 API 响应,将耗时的逻辑移动到后台(单独的线程)。这就是异步处理将提供帮助的地方。
分块输出:
如果您的端点需要发送大量数据。如果我决定在输出开始可用后立即开始渲染输出(在 UI 中),为了改善用户体验,来自 REST 端点的分块输出是更好的方法。
使用 jersey,我们可以实现异步处理和分块输出,如以下示例中所述。
public ChunkedOutput<String> getChunkedResponse() {
final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);
new Thread() {
public void run() {
try {
String chunk;
int index = 0;
while ((chunk = getWordAtIndex(index)) != null) {
output.write(chunk);
index++;
}
} catch (IOException e) {
//Add code to handle the IO Exception during this operation
} finally {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
return output; // This output object may be returned way before output is created
}
我已经尝试了一个样品来测试球衣和弹簧靴组合。你可以在这里的git存储库中查看它。
希望对您有所帮助。