spring 服务器可以知道客户端取消了请求,然后停止进程吗?

tp5buhyn  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(65)

例如,我的服务器处理一个请求花费了5秒,但客户端在2秒内停止等待并取消了这个请求,剩下的3秒将是浪费,服务器如何知道并停止处理过程?
我正在使用Java Spring,可以做到这一点吗?
如果没有,有什么好的方法来处理这种情况下,造成的浪费客户取消?

kninwzqo

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();
            }
        }
    }
}

字符串

相关问题