例如,我的服务器处理一个请求花费了5秒,但客户端在2秒内停止等待并取消了这个请求,剩下的3秒将是浪费,服务器如何知道并停止处理过程?我正在使用Java Spring,可以做到这一点吗?如果没有,有什么好的方法来处理这种情况下,造成的浪费客户取消?
kninwzqo1#
这是可能的,但取决于很多因素。HTTP/1.1没有明确的机制来告诉服务器中断请求处理,而不是关闭连接。但是,服务器应用程序通常不会从连接中阅读以检测处理期间的关闭,因此即使客户端关闭,服务器应用程序也不会注意到。HTTP/2和HTTP/3确实有一个显式的机制来告诉服务器中断请求处理。不幸的是,Servlet(以及JAX-RS的扩展)没有任何API允许应用程序在客户机发送“重置流”帧时得到通知。由于Spring Package 了Servlet和JAX-RS,您不太可能拥有此API,除非您希望绑定到低级别的容器特定API,以允许您的应用程序收到“reset stream”事件的通知。[免责声明,我是Jetty提交者]当使用Jetty时,您可以使用低级别的HTTP/2 API并收到此类事件的通知。举例来说:
ServerSessionListener sessionListener = new ServerSessionListener() { @Override public Stream.Listener onNewStream(Stream stream, HeadersFrame frame) { // Process the request. MetaData.Request request = (MetaData.Request)frame.getMetaData(); ... // Return a stream listener that can handle stream resets. return new Stream.Listener() { ... @Override public void onReset(Stream stream, ResetFrame frame, Callback callback) { // Handle stream reset from the client. ... callback.succeeded(); } } } }
字符串
1条答案
按热度按时间kninwzqo1#
这是可能的,但取决于很多因素。
HTTP/1.1没有明确的机制来告诉服务器中断请求处理,而不是关闭连接。
但是,服务器应用程序通常不会从连接中阅读以检测处理期间的关闭,因此即使客户端关闭,服务器应用程序也不会注意到。
HTTP/2和HTTP/3确实有一个显式的机制来告诉服务器中断请求处理。
不幸的是,Servlet(以及JAX-RS的扩展)没有任何API允许应用程序在客户机发送“重置流”帧时得到通知。
由于Spring Package 了Servlet和JAX-RS,您不太可能拥有此API,除非您希望绑定到低级别的容器特定API,以允许您的应用程序收到“reset stream”事件的通知。
[免责声明,我是Jetty提交者]
当使用Jetty时,您可以使用低级别的HTTP/2 API并收到此类事件的通知。
举例来说:
字符串