Java 从XMLStreamReader获取位置

Java 从XMLStreamReader获取位置,java,xml,servlets,stax,xmlstreamreader,Java,Xml,Servlets,Stax,Xmlstreamreader,我正在开发一个用于身份验证和路由的流式SOAP代理。代理必须从SOAP头读取并验证凭据和路由信息。它还必须使用目标服务使用的额外元数据来丰富SOAP头 我首先使用StAX(XMLStreamReader和XMLStreamWriter)完成了概念的快速验证。它似乎工作没有问题,所以概念得到了验证,但性能并不是我想要的。在分析原型时,我注意到应用程序在字符编码/解码上花费了大量cpu时间(30-80%) 我认为解决办法很简单: 将XMLStreamReader从InputStream读取的数据存

我正在开发一个用于身份验证和路由的流式SOAP代理。代理必须从SOAP头读取并验证凭据和路由信息。它还必须使用目标服务使用的额外元数据来丰富SOAP头

我首先使用StAX(XMLStreamReader和XMLStreamWriter)完成了概念的快速验证。它似乎工作没有问题,所以概念得到了验证,但性能并不是我想要的。在分析原型时,我注意到应用程序在字符编码/解码上花费了大量cpu时间(30-80%)

我认为解决办法很简单:

  • 将XMLStreamReader从InputStream读取的数据存储到缓冲区
  • 获取SOAP头的结束标记(getLocation())之前的偏移量
  • 从缓冲区发送数据,直到达到偏移量
  • 发送附加数据
  • 从缓冲区发送剩余数据
  • 从InputStream发送数据
这将避免所有不必要的编码/解码。然而,令我惊讶的是,我发现标准实现不支持getLocation()-它返回-1

过时部分-以下部分实际上不起作用,因为XMLStreamReader每次读取一个字节时会消耗大量内存。“我注意到,如果我编写一个每次返回一个字节并跟踪读取字节数的InputStreamReader,我可以从InputStream获得偏移量。但是,这似乎不是正确的解决方案-荒谬的读取调用数很可能会比额外的解码/编码造成更大的性能损失。”


如果编写自定义解析器是不可能的,那么我的选择是什么?是否有一个标准兼容的XMLStreamReader实现既经过验证又支持getLocation()?

只是想知道,您是否考虑过使用服务总线而不是使用自己的代理?Mule或ApacheServiceMix让人想起了吗?这是一个针对同步大容量服务的特定解决方案。我们使用服务总线来解决性能和额外延迟没有问题的情况。您是否尝试过不同的StAX实现,例如?它声称支持StAX规范的“所有可选功能”。不幸的是,Woodstox以字符形式返回偏移量。然而,规范规定,当底层数据源不是字符媒体时,偏移量应以字节为单位返回。(“将字节或字符偏移量返回到此位置指向的输入源。如果输入源是文件或字节流,则这是该流的字节偏移量,但如果输入源是字符媒体,则偏移量是字符偏移量。如果没有可用偏移量,则返回-1。”@SamiKorhonen我明白你的意思,这一点在中进行了详细讨论,建议您尝试一下。