我目前面临一个奇怪的问题,这种情况并不经常发生。我的应用程序使用带有JAXB和Java Streams(XMLStreamReader
(的STaX对具有数百万行的XML文件进行解组,并在启动时将这些对象导入数据库(如果XML已更改(。到目前为止,这是正确的工作,除了一些设备(约占1000多个设备的5%(。在这些设备上,我得到了一个javax.xml.stream.XMLStreamException
。有时重新启动会有所帮助,并且XML可以成功处理。XML本身在所有设备上始终具有相同的内容,因此XML和XSD都是有效的。
例外情况也不总是发生在同一个地方。例如:
由以下原因引起:javax.xml.stream.XMLStreamException:[row,col]处的ParseError:[2650616,17]消息:元素类型";XX";必须跟在属性规范之后>quot;或"/>";。
稍后:
[javax.xml.stream.XMLStreamException:[行,列]处的ParseError:[3272359,14]消息:元素类型";XY";必须跟在属性规范之后>quot;或"/>quot;.]
整个应用程序在微服务架构中运行,但不依赖于其他服务。在启动时,每个微服务都会初始化自己的状态。对我来说,可能存在一些内存问题,因为它不可复制,而且设备上的微服务版本没有差异。
在优化解组过程之前,我希望能够首先重现问题,以确保任何改进都有效。当我试图减少Xmx和Xms时,我可能会得到OutOfMemoryException
,但永远不会得到XMLStreamException
。
现在我在问自己,
XMLStreamException
发生的时间和原因以及我如何再现这种行为- 既然所有设备都应该相同,为什么这种情况可能不经常发生
- 我应该切换到内存效率更高的SAX吗
感谢您提前提供的所有帮助。
您的问题中没有足够的信息来给出明确的答案,但我们可以帮助您深入了解问题。
-
您看到的变化几乎可以肯定是由于输入变化,而不是设备故障。
-
错误表明流不是格式良好的XML。(从技术上讲,文本数据甚至不是XML;它会导致预验证解析错误。(
-
下面是一个格式不好的XML的简单例子,它会产生这样的错误:
<r a='''/>
请注意,在属性值中有一个未标注大小的
'
。当代码从源中提取数据,但未能对其进行转义,并将其写入属性值时,这种情况很容易发生。可变性将由数据可变性引起。例如,大多数名称中没有'
,但O'Toole
有。
正如@vanje在评论中提到的,记录下一步调试问题时失败的确切XML。
另请参阅
- 简化的XML转义
- 在';有效的xml';和';格式良好的xml'