我有一个基于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/