【问题标题】:How to tell if a file upload/download JAX-WS web service is streaming or buffering?如何判断文件上传/下载 JAX-WS Web 服务是流式传输还是缓冲?
【发布时间】:2014-10-21 14:53:35
【问题描述】:

在 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% 的把握确认文件确实在流式传输?

【问题讨论】:

    标签: java web-services jax-ws filestream ibm-was


    【解决方案1】:

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

    1. MTOM 注释优化了网络传输,即 发送/接收二进制数据(作为 HTTP 多部分消息二进制 附件)而不是 base64 编码的字符串。为了启用 您需要在您的网络服务中处理基于流的有效负载 除了@MTOM

      ,使用下面的注解

      @StreamingAttachment(parseEagerly = true, memoryThreshold = 40000L)

    此注解来自 SUN JAX-WS RI 包: 导入 com.sun.xml.ws.developer.StreamingAttachment;

    另外,使用 DataHandler 类型的 JAXB 数据字段以及下面的注释:

    @XmlMimeType("application/octet-stream")
    

    受保护的 DataHandler 数据;

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

      log.debug("Data handler class : " + stream.getClass().getName());
      

    【讨论】:

    • 请尝试格式化您的问题,真的很难理解发生了什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2013-03-25
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多