gpt4 book ai didi

java - 在系统 A->B->C 之间发送文件而不将整个文件存储在 B 中

转载 作者:IT老高 更新时间:2023-10-28 13:55:27 27 4
gpt4 key购买 nike

我有 3 个独立的 Spring Web 应用程序

  • A使用spring 4.x
  • B使用spring 3.2.0
  • C使用spring 4.x

BC 公开用于上传文件的 REST Controller

  • A读取文件并上传到B
  • B 将请求发送给 C,无需读取文件内容
  • 然后 C 对文件进行任何操作。

所以流程是A->B->C

我的问题是 - 是否可以设置 B 以使 B 不会将整个文件存储在内存中,但会读取传入的流和转发给C

我设法做的是:一个

public void sendFileFromA() throws FileNotFoundException {
final InputStream fis = new FileInputStream(new File("someFile"));
final RequestCallback requestCallback = new RequestCallback() {
@Override
public void doWithRequest(final ClientHttpRequest request) throws IOException {
request.getHeaders().add("Content-type", "application/octet-stream");
IOUtils.copy(fis, request.getBody());
}
};
final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

final HttpMessageConverterExtractor<String> responseExtractor = new HttpMessageConverterExtractor<>(
String.class, restTemplate.getMessageConverters());
restTemplate.execute("http://b_url/upload", HttpMethod.POST, requestCallback, responseExtractor);
}

B

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody String handleFileUpload(HttpServletRequest request) throws IOException {
final ServletInputStream input = request.getInputStream();

final RequestCallback requestCallback = new RequestCallback() {
@Override
public void doWithRequest(final ClientHttpRequest request) throws IOException {
request.getHeaders().add("Content-type", "application/octet-stream");
try (OutputStream body = request.getBody()) {
IOUtils.copy(input, body);
}
}
};
final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

final HttpMessageConverterExtractor<String> responseExtractor = new HttpMessageConverterExtractor<>(
String.class, restTemplate.getMessageConverters());
restTemplate.execute("http://c_url/upload", HttpMethod.POST, requestCallback, responseExtractor);

return "success";
}

C

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody String handleFileUpload(HttpServletRequest request) throws IOException {
ServletInputStream input = request.getInputStream();

try (BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream("zibiTest"))) {
IOUtils.copy(input, output);
}
return "success";
}

我可以使用 B 轻松地将超过 10GB 的文件从 A 复制到 C。

通过这样的解决方案,我们可以尝试在传输时停止 A,B 和 C 应该被通知错误,但有时会发生错误消息没有到达 C - 它会因套接字超时异常而关闭,任何想法为什么会发生这种情况以及如何正确实现?

这是一种有效的方法还是可以更好地处理?

最佳答案

我会尝试在 C 上设置比在 B 上更小的套接字超时。目前似乎两者都有一些默认值,所以如果 A 挂起,B 和 C 将几乎同时停止获取数据。两者都开始超时,并且可能是一种竞争条件,它取决于哪个超时的准确性。

关于java - 在系统 A->B->C 之间发送文件而不将整个文件存储在 B 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34141309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com