向 HttpServletResponse 添加标头会增加响应时间

时间:2021-02-05 22:00:14

标签: java spring servlets outputstream

我正在尝试通过邮递员测试休息 api。调用rest api(GET REQ A)时,向另一个服务发出内部http GET请求(GET REQ B),解析该服务的xml响应,修改它并将其作为原始请求的响应发送回(GET REQ A).

我想将内部http请求(GET REQ B)的响应头设置为原始请求(GET REQ A)的响应头。

                    ServletOutputStream os = response.getOutputStream();
                    try
                    {
                        XMLOutputter outputter = new XMLOutputter();
                        
                        // For loop for copying headers 
                        Header [] headers = req.getResponseHeaders();
                        for (Header h : headers) {
                            LOG.info("Setting headers");
                            response.addHeader(h.getName(), h.getValue());
                        }
                        
                        outputter.output(dashTrimmer.getDocument(),os);
                        response.setStatus(statusCode);
                        os.flush();
                        os.close();
                        LOG.info("Trimmed File sent");
                        return;
                    } catch (IOException e) {
                        LOG.info(e.getMessage());
                    } catch (Exception e) {
                        LOG.info(e.getMessage());
                    }
                    response.setStatus(statusCode);
                    return;

在下面的代码中有一个 for 循环将所有来自内部 http 请求 (GET REQ B) 的标头复制到原始获取请求 (GET REQ A) 的 HttpServletResponse 中。

当我注释掉 for 循环时,原始请求的响应时间约为 250 毫秒。

当存在 for 循环时,响应时间约为 20 秒。 在邮递员中,响应代码 200 在 ~1s 内收到,在日志中,我可以在发送请求的 ~1s 内看到日志语句“Trimmed file sent”。但是连接还活着,请求没有完成。

这种行为的原因可能是什么,我该如何解决?

0 个答案:

没有答案