gpt4 book ai didi

java - MTOM 不以 block 的形式写入数据

转载 作者:行者123 更新时间:2023-12-01 11:20:26 28 4
gpt4 key购买 nike

我们有一个用例,我们必须通过 http 将大数据文件从环境 A 传输到环境 B。我们想要实现的是,发送方将数据分块发送,接收方开始将数据分块写入文件。因此我们决定使用 MTOM。

网络服务代码:

@MTOM(enabled = true, threshold=1024)
@WebService(portName = "fileUploadPort", endpointInterface = "com.cloud.receiver.FileUploadService", serviceName = "FileUploadService")
@BindingType(value = SOAPBinding.SOAP12HTTP_MTOM_BINDING)
public class FileUploadServiceImpl implements FileUploadService {

@Override
public void uploadFile(FileUploader Dfile) {

DataHandler handler = Dfile.getFile();
try {
InputStream is = handler.getInputStream();

OutputStream os = new FileOutputStream(new File(absolutePath));
byte[] b = new byte[10000000];
int bytesRead = 0;
while ((bytesRead = is.read(b)) != -1) {
os.write(b, 0, bytesRead);
}
os.flush();
os.close();
is.close();

} catch (IOException e) {
e.printStackTrace();
}

}
}

客户代码:
public static void main(String args[]) throws Exception {

URL url = new URL("http://localhost:8080/CloudReceiver/FileUploadService?wsdl");

QName qname = new QName("http://receiver.cloud.com/", "FileUploadService");

Service service = Service.create(url, qname);
FileUploadService port = service.getPort(FileUploadService.class);
// enable MTOM in client
BindingProvider bp = (BindingProvider) port;
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);

FileUploader f = new FileUploader();
DataSource source = new FileDataSource(new File("G:\\Data\\Sender\\temp.csv"));
DataHandler dh = new DataHandler(source);
Map<String, Object> ctxt = ((BindingProvider) port).getRequestContext();
// Marking Chunk size at Client.
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 100);

f.setFile(dh);
port.uploadFile(f);
}

当我们传输小于 100MB 的数据时,一切正常。
超过 (100MB+) 应用程序服务器 (JBoss 8.2) 的数据文件在接收端抛出以下异常。
java.io.IOException: UT000020: Connection terminated as request was larger than 104857600

我明白这个错误是因为 standalone.xml 中的属性
<http-listener name="default" socket-binding="http" max-post-size="104857600"/>

这意味着数据不会以块的形式写入文件,而是保存在内存中,并在传输完成后写入文件。

我们如何实现将数据写入数据块中的文件?我们不希望后期内存增加。文件大小可以达到 1 TB。

环境:
JBoss 8.2 Wild Fly,Java 8

最佳答案

首先,提到的限制

<http-listener name="default" socket-binding="http" max-post-size="104857600"/>
表示服务器接受的整个 POST 请求的最大大小。
无论是否使用 MTOM,是否使用块 - 您只需在此处发送一个 POST 请求的文件。使用块不会改变这一点——所有带有文件数据的块都是同一个 POST 请求的一部分。
所以它按预期工作:100M+ 文件太大了,相应的限制。
那么,我很确定这个结论

This means that Data is not written to file in Chunks instead it is kept in memory and than written to file after transmission completes.


简直是错误的。将潜在的大卷保存在内存中是不安全的,因此服务器通常不会这样做,而是将这些卷放入一些临时文件中。

关于java - MTOM 不以 block 的形式写入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34353410/

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