从Apache Axis2,MTOM中的DataHandler重新读取附件是否安全?

时间:2013-08-05 17:41:06

标签: java axis2 axiom

我有一个基于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中继未指定,因此Axiom默认为Behavior.NON_DESTRUCTIVE允许重读。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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