当我们尝试执行 jaxb-object-to-xml-transformer 时,我们在 Mule ESB 中遇到 java.util.ConcurrentModificationException

问题描述 投票:0回答:1

在 Mule 3.9.0 中,当我们尝试使用 jaxb 将对象转换为 XML 时,我们收到以下错误

Message               : null (java.util.ConcurrentModificationException)
Element               : /test/processors/0 @ test-masked:masked.xml:685 (JAXB Object to JMSMessage (XML string))
--------------------------------------------------------------------------------
Exception stack is:
null (java.util.ConcurrentModificationException) (org.mule.api.transformer.TransformerException)
  java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
  java.util.ArrayList$Itr.next(ArrayList.java:851)
  com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister$1.next(Lister.java:284)
  com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:135)
  com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:155)
  com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)
  com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
  com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152)
  com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)
  com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
  com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152)
  com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)
  com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:593)
  com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:324)
  com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
  com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315)
  com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
  javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:116)
  org.mule.module.xml.transformer.jaxb.JAXBMarshallerTransformer.doTransform(JAXBMarshallerTransformer.java:77)
  org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:415)
  org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:366)
  (40 more...)

我们尝试转换的地方是在异步调用中,如下所示

<async>


<mulexml:jaxb-object-to-xml-transformer
                    returnClass="java.lang.String" mimeType="text/xml"
                    jaxbContext-ref="JAXB_Context_Update_Journey"/>

<logger
                    message="#[message:correlationId] | pushing to cache.inbox -payload - #[payload]"
                    level="INFO" category="update cache" />
 </async>

项目希望我们坚持使用社区版本,因此我们无法升级到 4 +

针对目前的情况,我们如何解决这个问题?没有它工作得很好。当我们更改为异步后,这个问题就开始了。我们也升级到了 Mule 3.9.5,但还是同样的问题。

jaxb mule mule-esb
1个回答
0
投票

ConcurrentModificationException 异常和堆栈跟踪表明列表被同时修改。看来

async
线程和流程的原始线程同时使用有效负载,从而导致错误。您可以通过创建输入负载的克隆来解决该问题。但这可能与在原始线程中转换有效负载相同。

Mule 4 可能可以更好地处理这种情况,其功能是将操作定位到变量而不是有效负载和隔离,但是您需要迁移您的应用程序并查看您的用例在那里如何工作。

© www.soinside.com 2019 - 2024. All rights reserved.