0

在 WAS 8.0 上使用 JAX-WS Web 服务来上传/下载大于 100MB 的大文件。使用文件流作为此类大文件的选项,我遇到了 StreamingDataHandler 和 StreamingAttachmentFeature,这两个功能都只能通过 JAX-WS 的 Metro GlassFish 实现或 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% 的把握确认文件确实在流式传输?

4

1 回答 1

1

我有相同的要求,即处理传入有效负载的大文件而不会使内存膨胀。我必须将 JVM 堆大小提高到 2G,才能让基于非流式处理的解决方案处理并发文件上传。在实现基于流的解决方案之前,我使用的是内置 JAX-WS RI 2.1.5 的 Weblogic 10.3.5。

  1. 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 数据;

  1. 是的,您可以通过监视 JVM 堆大小来判断流式传输是否正常工作(我注意到,由于基于字符串的有效负载处理,即在非流式传输模式下,100MB 附件的已用堆内存跃升至 700MB)。或者您可以记录数据字段的类名,它类似于“StreamingDataHandler”(从 DataHandler 扩展)。如果您使用 Eclipse 或类似的调试器并在那里(在您的端点类中)放置一个断点并查看接收到的有效负载,您会注意到“数据”指的是流处理程序具体类。

    log.debug("Data handler class : " + stream.getClass().getName());
    
于 2015-06-11T18:47:01.350 回答