我有一个基于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();
这适用于简单的测试。我能否认为这总是安全的?
PartOnFile
,从内存中假脱机到磁盘,支持重用,直到(我认为)SOAP请求结束;通过FileAccessor
PartOnMemoryEnhanced
,它将数据存储在多个byte
数组中,因此应该支持重复使用直到收集垃圾ParserInputStreamDataSource
,它支持不同的破坏性或非破坏性Behavior
枚举,但Axis中继未指定,因此Axiom默认为Behavior.NON_DESTRUCTIVE
允许重读。但这都是对粗略的代码扫描,我不太清楚,所以我可能错过了其他代码路径,或者我可能只是错了。
Axis或此处的任何其他接口是否保证可以多次读取DataHandler?如果没有,是否有一个很好的机制来检测Axis何时传递附件只读一次模式,所以我可以自己缓存第一次读取?如果请求是MTOM,它会有所不同吗?谢谢!
答案 0 :(得分:1)
DataHandler#getInputStream()
方法基本上委托给DataSource#getInputStream()
,该方法的合同特别要求DataSource
的内容可以多次读取。 Axiom旨在符合该合同。
Axiom定义了一个扩展接口(DataHandlerExt
),可用于想要“破坏性地”读取内容的场景。
但是有一件事需要注意:在请求处理结束时(即在调用服务之后),Axis2应指示Axiom销毁与DataHandler
相关的临时文件请求期间创建的实例。这意味着如果您存储对DataHandler
的引用并稍后尝试访问它(在另一个请求中,或在某些后台线程中),那么这可能会失败。请注意,在Axiom的未来版本中,计划引入一个选项,让垃圾收集器处理清理,这将避免此问题。