【问题标题】:Is it safe to re-read an attachment from a DataHandler in Apache Axis2, MTOM or not?从 Apache Axis2、MTOM 中的 DataHandler 重新读取附件是否安全?
【发布时间】:2013-08-05 17:41:05
【问题描述】:

我有一个基于 Axis2 1.4.1 的 SOAP Web 服务,它使用 pattern from the docs 接受 MTOM 上传:

public class MTOMService {
    public void uploadFileUsingMTOM(OMElement element) throws Exception {
        OMText binaryNode = (OMText) (element.getFirstElement()).getFirstOMChild();
        DataHandler actualDH;
        actualDH = (DataHandler) binaryNode.getDataHandler();

        // consume data from DataHandler
        InputStream inputStream = actualDH.getInputStream();
    }
}

我可能需要多次从 DataHandler 中读取数据。

        inputStream.close();
        // get second InputStream to consume same data from DataHandler again
        InputStream inputStream2 = actualDH.getInputStream();

这适用于简单的测试。我可以假设这总是安全的吗?

  • 我在文档中找不到任何明确的内容,无论是标准 DataHandler 还是 Axiom 实现的特定 DataSource(但我可能错过了)
  • Axis 1.4.1 使用 Axiom 1.2.9,它将附件表示为
    • PartOnFile,从支持重用的内存假脱机到磁盘,直到(我认为)SOAP 请求结束;通过FileAccessor阅读
    • PartOnMemoryEnhanced,它将数据存储在多个 byte 数组中,因此应该支持重用,直到垃圾收集为止
  • 展望未来,更高版本的 Axiom 使用不同的类 ParserInputStreamDataSource,它支持不同的破坏性或非破坏性 Behavior 枚举,但 Axis trunk 未指定,因此 Axiom 默认为 Behavior.NON_DESTRUCTIVE,它允许重新读取。

但这都是对代码的粗略扫描,我不是很了解,所以我可能错过了其他代码路径,或者我可能是错的。

Axis 或此处的任何其他接口是否保证可以多次读取 DataHandlers?如果没有,是否有一个很好的机制来检测 Axis 何时传递附件只读模式,以便我可以自己缓存第一次读取?请求是否为 MTOM 是否有区别?谢谢!

【问题讨论】:

    标签: java axis2 axiom


    【解决方案1】:

    DataHandler#getInputStream() 方法基本上委托给DataSource#getInputStream(),并且该方法的合同特别要求DataSource 的内容可以被多次读取。 Axiom 旨在符合该契约。

    Axiom 定义了一个扩展接口 (DataHandlerExt),可用于想要“破坏性”读取内容的场景。

    但是有一点需要注意:在请求处理结束时(即在您的服务被调用之后),Axis2 应该指示 Axiom 销毁与创建的 DataHandler 实例相关的临时文件在请求期间。这意味着如果您存储对 DataHandler 的引用并稍后尝试访问它(在另一个请求中或在某个后台线程中),那么这可能会失败。请注意,在 Axiom 的未来版本中,计划引入一个选项,让垃圾收集器处理该清理,从而避免此问题。

    【讨论】:

    • 谢谢。 DataSource 文档没有明确说明重用,但你说得对,他们确实说“新流位于开始位置”,我猜这已经足够接近了,你是正确的人选。谢谢,是的,我知道临时文件在操作结束时丢失了:这里仍然是一个开放的设计问题,我们是否在请求期间将数据从文件中提取出来,然后挖掘类以查找文件和自行复制或硬链接以在必要时延长使用寿命。
    猜你喜欢
    • 2011-04-21
    • 2011-08-31
    • 2014-03-27
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多