如何通过流媒体休息服务巨大的文件?

Rol*_*ndo 8 java spring

我有2个Spring Web应用程序:Application1和Application2.在Application1中,我在" http:// application1/getbigcsv "中有一个端点,它使用流式传输,以便在用户点击该URL时向用户提供巨大的150MB CSV文件.

我不希望用户直接点击Application1,而是点击Application2.如果我在Application2的控制器中有以下方法

@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv")
@ResponseStatus(value = HttpStatus.OK)
public String streamLargeCSV() {
    // Make an HTTP Request to http://application1/getbigcsv
    // Return its response
}
Run Code Online (Sandbox Code Playgroud)

我担心的是上面没有做"流",而Application1正在做流式传输.有没有什么方法可以确保application2将以流方式从application1的rest端点返回相同的数据?或者上面的方法实际上已经在"Streaming"方法中返回了东西,因为Application1正在将其端点作为流服务器提供服务?

Mic*_*l-O 14

首先:您可以但不能使用该方法签名.

遗憾的是,您还没有展示如何在app1中生成CSV文件,无论这是真正的流式传输.我们假设它是.

您的签名将如下所示:

@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv")
@ResponseStatus(value = HttpStatus.OK)
public void streamLargeCSV(OutputStream out) {
    // Make an HTTP Request to http://application1/getbigcsv
    // Return its response
}
Run Code Online (Sandbox Code Playgroud)

现在我们必须首先从app1获取输入流.使用Apache HttpClient 获取您的HttpEntity.该实体有一个writeTo(OutputStream)接收out参数的方法.它将阻塞,直到所有字节都被消耗/流式传输.完成后,释放所有HttpClient资源.

完整代码:

@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv")
@ResponseStatus(value = HttpStatus.OK)
public void streamLargeCSV(OutputStream out) {
    // Make an HTTP Request to http://application1/getbigcsv
    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet("http://application1/getbigcsv");
    CloseableHttpResponse response = httpclient.execute(httpGet);
    try {
        HttpEntity entity = response.getEntity();
        // Return its response
        entity.writeTo(out);
    } finally {
        response.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

是我的真实世界的例子.开始阅读"有兴趣说出我所取得的成就特别是:"