Caused by: com.thoughtworks.xstream.converters.ConversionException: Cannot convert type com.qlangtech.tis.plugin.datax.seq.OnSeqKey to type com.qlangtech.tis.plugin.datax.seq.SeqKey
---- Debugging information ----
message : Cannot convert type com.qlangtech.tis.plugin.datax.seq.OnSeqKey to type com.qlangtech.tis.plugin.datax.seq.SeqKey
class : com.qlangtech.tis.plugin.datax.doris.DorisSelectedTab
required-type : com.qlangtech.tis.plugin.datax.doris.DorisSelectedTab
converter-type : com.qlangtech.tis.util.XStream2$TISCompositConvert
path : /com.qlangtech.tis.plugin.KeyedPluginStore/plugins/com.qlangtech.tis.plugin.datax.doris.DorisSelectedTab/seqKey
line number : 25
class[1] : java.util.ArrayList
required-type[1] : java.util.ArrayList
converter-type[1] : com.thoughtworks.xstream.converters.collections.CollectionConverter
-------------------------------
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:452)
at com.qlangtech.tis.util.XStream2$TISCompositConvert.doUnmarshal(XStream2.java:252)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:277)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:52)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readBareItem(AbstractCollectionConverter.java:132)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:117)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:99)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:92)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:86)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:81)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
at com.qlangtech.tis.util.RobustReflectionConverter.unmarshalField(RobustReflectionConverter.java:402)
at com.qlangtech.tis.util.RobustReflectionConverter.doUnmarshal(RobustReflectionConverter.java:344)
at com.qlangtech.tis.util.RobustReflectionConverter.unmarshal(RobustReflectionConverter.java:278)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:52)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:136)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1421)
at com.qlangtech.tis.util.XStream2.unmarshal(XStream2.java:70)
at com.qlangtech.tis.extension.impl.XmlFile.unmarshal(XmlFile.java:119)
at com.qlangtech.tis.plugin.PluginStore.load(PluginStore.java:399)
... 29 common frames omitted
由于扩展点
com.qlangtech.tis.plugin.datax.seq.SeqKey
是在 插件内部tis-datax-doris-plugin
定义的 SeqKey.java异常复现:
在assemble节点上出现如下错误:
故障定位
参考单元测试,TestDorisSelectedTab.java
由于执行了 TIS.clean(),导致 pluginManager中UberClassloader会重新初始化,导致之前已经加载的class会被重新加载,在内存中生成两个版本的class(虽然类名是相同的)
解决办法
对TIS.clean() 进行重载,引入参数 removeTIS:boolean,清除TIS过程中是否删除TIS实例。调用端可使用如下方法: