在WAS 8.0上使用JAX-WS Web服务上传/下载大文件> 100MB。使用文件流作为此类大文件的选项,我遇到了StreamingDataHandler和StreamingAttachmentFeature,这两者都是仅通过Metro GlassFish实现的JAX-WS或WebLogic实现提供的功能。
使用WAS 8.0我已将它们作为选项排除,并实现了一个只使用DataHandler和MTOM注释的Web服务来上传和下载文件。在客户端,我启用了MTOMFeature并为JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE(“com.sun.xml.ws.transport.http.client.streaming.chunk.size”)设置了值。
我的问题是双管齐下的: 1.是否可以仅使用上述类/注释实际实现文件流传输? 2.如果是,我如何100%确定文件确实正在流式传输?
答案 0 :(得分:1)
我有相同的要求,即处理有效载荷中的大文件而不会使内存膨胀。我不得不将JVM堆大小提升到2G,以获得基于非流的解决方案处理并发文件上传。在实现基于流的解决方案之前,我使用的是Weblogic 10.3.5,它内置了JAX-WS RI 2.1.5。
MTOM注释优化了线路上的传输,即 发送/接收二进制数据(作为HTTP多部分消息二进制文件) 附件)而不是base64编码的字符串。为了启用 您需要的Web服务中基于流的有效负载处理 除了@MTOM
之外,还可以使用下面的注释@StreamingAttachment(parseEagerly = true,memoryThreshold = 40000L)
此注释来自SUN JAX-WS RI包: import com.sun.xml.ws.developer.StreamingAttachment;
另外,使用DataHandler键入的JAXB数据字段以及下面的注释:
@XmlMimeType("application/octet-stream")
受保护的DataHandler数据;
是的,您可以通过监控JVM来判断流是否正常工作 堆大小(我注意到它跳转到700MB使用堆内存为100MB 由于基于字符串的有效载荷处理,即在 非流模式)。或者您可以记录数据的类名 字段,它会像" StreamingDataHandler" (哪一个 从DataHandler扩展而来。如果您使用Eclipse或类似的调试器 并在那里放置一个断点(在你的端点类内)并查看 要收到有效载荷,你应该注意到"数据"指的是 流处理程序具体类。
log.debug("Data handler class : " + stream.getClass().getName());