alexpdh's blog

记一次生产环境因jdk的bug导致的异常

最近生产环境每隔一段时间会抛一个异常:

1
2
3
4
5
6
7
8
Exception in thread "main" javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:219)
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:189)
at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:277)
at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129)
at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLEventReader(XMLInputFactoryImpl.java:78)
at Main.main(Main.java:38)

元宵节快乐

yuanxiaojie

  • 在讨论问题之前来点题外话,今天是中国传统佳节-元宵节,祝大家元宵节快乐。在上周播出的歌手中。赵雷的一首《成都》彻底火了,同时故事中描述的 “走到玉林路的尽头,坐在小酒馆的门口” 中的小酒馆也火了,由于我现在住的地方离小酒馆比较近(大概半小时路程),于是今天一个人走到了玉林路口的尽头看到了歌中说的小酒馆,门口拍照的人源源不断,走进小酒馆里在白天的情况下居然满座,经营小酒馆的是一对夫妇,老板看起挺朴实的,老板娘大着肚子和丈夫一起忙前忙后。老板给我找了个拼桌的位置坐下要了瓶啤酒坐下,屋里只放赵雷的歌。比起七八十年代,什么事物在互联网信息时代下蹿红的速度相当惊人。
    xiaojiuguan01

回到正题

异常的大概意思是“解析器解析xml文档时文档实体扩展个数超过了 “640000” 个”,抛这个异常的是我们的一个专门接收中音给我们分发音乐素材的程序。系统采用的是基于CXF的WebService接口程序。有用基于SOAP传输的xml形式的接口数据,也有rest设计传输的json格式的数据。不过报的这个异常是xml形式的接口抛出来的,它限制了在读取xml文档时共享实体的个数不能大于640000个,影响的jdk版本有 5.0u55,6u65,7u45,8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.ByteArrayInputStream;
import javax.xml.stream.XMLInputFactory;
public class Main {
public static void main(String[] args) throws Exception {
String xml = "<?xml version=\"1.0\"?><test></test>";
XMLInputFactory factory = XMLInputFactory.newInstance();
for (int i = 0; i < 64001; i++) {
ByteArrayInputStream stream = new ByteArrayInputStream(xml.getBytes());
factory.createXMLEventReader(stream);
}
}
}

我们服务器的jdk版本刚好是这个版本的。这个bug在 1.7.0_51 版本之后得到的修复,因此只需将jdk版本升级到 1.7.0_51 之后的版本就可以解决这个问题了。下面是官网上对这个bug描述。
https://bugs.openjdk.java.net/browse/JDK-8028111

alexpdh wechat
欢迎扫一扫关注 程序猿pdh 公众号!