在过去的几个月里,我一直在与SAXParser搏斗,以找出一个奇怪的错误源自何处。
在我工作的地方,我收到了很多相当大的XML文件,可以加载到我们的数据库中。我们有一些代码使用SAXParser和我们自己的DefaultHandler实现这样做,这很好。
但是,我现在有一个BlockingQueue,它运行多个进程,其中包括我上面写过的SAXParser。当我这样做时,我开始看到从另一个文件(!?)中弹出错误的XML,导致这些加载失败。
所有解析器,他们的读者和作者都在不同的线程上,据我所知,他们没有共享任何变量,这让我几个星期以来一直在挠头!
是否有些东西我不知道,有没有人经历过这个,如果是这样,你是如何解决它的?
编辑:
好。因此,在查看我的实现的每个细节以及稍后的大量研究之后,我发现了导致我的线程错误的原因。它不是SAXParser,而是我的DefaultHandler代码!
在DefaultHandler中,我有一个Enum让我知道我在哪个元素。 Enum有布尔变量来帮助程序流程。我的问题是Javas Enum是一个单例对象,它通常是线程安全的,但是当在多个线程中使用时会产生奇怪的行为,因为布尔值是可变的。
为了修复我的代码,我只是将布尔值从Enum中取出,因为它们甚至不需要在那里并将它们直接放在我的DefaultHandler中,它们现在应该是线程安全的。呼!