我有一个基于 Axis2 1.4.1 的 SOAP Web 服务,它使用文档中的模式接受 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 或此处的任何其他接口是否保证可以多次读取 DataHandlers?如果没有,是否有一个很好的机制来检测 Axis 何时传递附件只读模式,以便我可以自己缓存第一次读取?请求是否为 MTOM 是否有区别?谢谢!