Bor*_*zic 7 java exception jaxb unmarshalling race-condition
我们正在经历一个非常难以追踪的问题,我们在尝试迭代一组未编组对象时有时会看到ClassCastExceptions .最重要的一点是,有时,在重新启动后的特定代码工作正常.这似乎指向了并发/时间/竞争条件的方向.我可以确认JAXBContext,marshallers和unmarshallers都没有被同时使用.我们已经通过锁定序列化对它们的访问.
但是,由于我们在OSGi平台上运行,其中各个捆绑包通过Spring DM异步初始化,因此可能有2个不同的捆绑包同时创建其JAXBContext.
在任何情况下,我都会感谢任何可能导致这些间歇性 ClassCastExceptions 的解释的指针.间歇性很重要,因为它们表明代码本身通常工作正常,但某些外部因素似乎会影响行为.
这是异常的一个具体示例(注意我删除了公司特定的东西):
Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to com.foobar.TunnelType
at com.foobar.NetMonitorImpl.getVpnStatus(NetMonitorImpl.java:180)
Run Code Online (Sandbox Code Playgroud)
第180行的那个方法是for()构造循环在一个解组对象内部的TunnelType对象集合(所述解组工作正常BTW).
鉴于实际的对象解组很好,JAXB在物理上是否可以将ElementNSImpl对象留在嵌套集合中?
运行环境:
出于绝望,我们转向在JAXBContext.class对象上进行同步,认为这是某些竞争条件的唯一剩余可能性,至少我们无法再次重现此问题。这是关键代码:
synchronized (JAXBContext.class) {
context = JAXBContext.newInstance(packageList, classLoader);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16817 次 |
| 最近记录: |