我正在研究将用于身份验证和路由的流式 SOAP 代理。代理必须从 SOAP 标头读取和验证凭据和路由信息。它还必须使用目标服务使用的其他元数据来丰富 SOAP 标头。
我首先使用 StAX(XMLStreamReader 和 XMLStreamWriter)完成了一个快速的概念验证。它似乎可以正常工作,因此概念得到了证明,但性能并不是我所期望的。在分析原型时,我注意到应用程序在字符编码/解码上花费了大量的 CPU 时间(30-80%)
我认为解决方案很简单:
- 将 XMLStreamReader 从 InputStream 读取的数据存储到缓冲区
- 获取 SOAP 标头结束标记之前的偏移量 (getLocation())
- 从缓冲区发送数据,直到达到偏移量
- 发送附加数据
- 从缓冲区发送剩余数据
- 从 InputStream 发送数据
这将避免所有不必要的编码/解码。然而令我惊讶的是,我发现标准实现不支持 getLocation() - 它返回 -1。
过时的部分 - 以下内容实际上不起作用,因为 XMLStreamReader 在读取一个字节时会消耗大量内存。“我注意到我可以从 InputStream 获得偏移量,如果我编写一个 InputStreamReader 一次返回一个字节并跟踪读取的字节数。但是这感觉不是正确的解决方案 - 荒谬的读取调用数量很可能比额外的解码/编码造成更大的性能损失。”
如果编写自定义解析器是不可能的,我在这里有什么选择?是否有经过验证并支持 getLocation() 的符合标准的 XMLStreamReader 实现?