我有一个基于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实现的特定数据源,我在文档中找不到任何确定的内容(但我可能会错过它)
轴1.4.1使用Axiom 1.2.9,将附件表示为

PartOnFile,从支持重新使用的内存缓冲到磁盘,直到(我认为)SOAP请求结束;通过FileAccessor读取
PartOnMemoryEnhanced,它将数据存储在多个byte数组中,因此应该支持重用直到垃圾被收集

展望未来,Axiom的更高版本使用支持不同破坏性或非破坏性ParserInputStreamDataSource枚举的不同类Behavior,但是Axis主干未指定,因此Axiom默认为Behavior.NON_DESTRUCTIVE,允许重新读取。


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

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

最佳答案

DataHandler#getInputStream()方法基本上是委派给DataSource#getInputStream()的,并且该方法的协定特别要求DataSource的内容可以多次读取。公理旨在遵守该合同。

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

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

关于java - 从Apache Axis2,MTOM中的DataHandler重新读取附件是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18064283/

10-10 08:55