springxd - 无法反序列化 [classname] Class not found
Posted
技术标签:
【中文标题】springxd - 无法反序列化 [classname] Class not found【英文标题】:springxd - unable to deserialize [classname] Class not found 【发布时间】:2017-05-26 15:23:13 【问题描述】:我在使用 springxd 将数据从 ESB JMS 队列保存到 avro 中的 HDFS 时遇到了这个问题。 我创建了自定义处理器来解析来自 JMS 队列的入站 xml 并转换为 avro 并使用 springxd 流保存在 HDFS 中。
这是我的流定义 -
stream create --name NewStream --definition "jms --destination=my.jms.queue --provider=tibco | mycustomprocessor | hdfs-dataset --basePath=/data_lake/avrodata --idleTimeout=60000" --deploy
这是我得到的错误,我也在打印看起来没问题的消息..
ERROR inbound.NewStream.1-redis:queue-inbound-channel-adapter1 redis.RedisMessageBus$1 - 无法传递消息;重试用尽;消息发送到队列'ERRORS:NewStream.1' org.springframework.messaging.MessageHandlingException:消息处理程序[NewStream.1.bridge.handler]中发生错误;嵌套异常是 org.springframework.xd.dirt.integration.bus.serializer.SerializationException:无法反序列化 [classname]。找不到类。
这表示未找到类,但该类存在并且正在使用,并且我正在打印来自同一类的对象 -
message object"NameType": null, "Names": null, "EndDeviceEventDetails": null, "EndDeviceEvent": null, "EndDeviceEventType": null, "Header": "Noun": "EndDeviceEvents", "Context": "PROD", "Verb": "created", "Value": null, "Source": "ADCS", "Timestamp": "2014-08-06T17:00:03.319-07:00", "CorrelationID": "eb1ccda2-6bcc-446d-b90e-3a72a46f861a", "Name": null, "MessageID": "fe567bfb-09d5-46fd-a9f4-7dcad8c51e74", "Property": "PropertyName": ["TransactionDomain", "GridDirectorAction", "MessageIdentifier", "Stereotype"], "PropertyValue": ["MeterEvent", "urn:com.bchydro.meter.event", "Read Data Id=2.16.840.1.114416.1.63.4215386", "MeterEvent"], "Payload": "EndDeviceEvents": ["mRID": "18541", "createdDateTime": null, "issuerID": "2014-08-06T23:05:54Z", "issuerTrackingID": null, "reason": null, "severity": null, "userID": "3", "Asset": "AssetmRID": null, "AssetNames": ["Name": "2.16.840.1.114416.1.63.4215386", "NameType": "NameTypeDescription": null, "NameTypeName": "ESN", "NameTypeAuthority": null], "EndDeviceEventDetails": ["EndDeviceEventDetailsName": "EventSequenceNumber", "EndDeviceEventDetailsValue": "46", "EndDeviceEventDetailsName": "EventSequenceNumber", "EndDeviceEventDetailsValue": "46", "EndDeviceEventDetailsName": "EventSequenceNumber", "EndDeviceEventDetailsValue": "46", "EndDeviceEventDetailsName": "EventSequenceNumber", "EndDeviceEventDetailsValue": "46"], "EndDeviceEventType": "HAN Meter Network Change", "EndDeviceEventNames": ["Name": "HAN Reset non-routine", "NameType": "NameTypeDescription": null, "NameTypeName": "Network Change Reason", "NameTypeAuthority": null], "Status": "StatusDateTime": null, "StatusReason": null, "StatusRemark": null, "StatusValue": null, "UsagePoint": null], "EndDeviceEventType": ["EndDeviceEventTypemRID": null, "EndDeviceEventTypedomain": null, "EndDeviceEventTypeeventOrAction": null, "EndDeviceEventTypesubDomain": null, "type": null, "EndDeviceEventTypeNames": null]
感谢您的帮助...
谢谢, 阿杰
【问题讨论】:
【参考方案1】:如果这是单节点部署,则可能是类加载器问题 - 尝试将包含该类的 jar 移动到 xd/lib
(并将其从各个模块中删除)。
【讨论】:
它是分布式模式部署。我们创建 modules.zip 文件并部署它,其中包含 common/job/sink 和处理器。我从源文件作为文件在单节点中尝试了这个自定义处理器,它工作正常。对于单节点,我只需将 customprocessor 复制到 xd/modules/processor 即可。但是对于分布式我已经将新的自定义处理器复制到模块/处理器,然后部署了 zip 文件。 CustomProcessor 解析 xml 并打印对象,但在 redis 中失败。 此异常是入站异常 - 可能在接收器中。异常似乎很明显:unable to deserialize [bch.meterevent.Message]. Class not found.
如果根本原因有堆栈跟踪throw new SerializationException("unable to deserialize [" + className + "]. Class not found.", e)
,您可以编辑您的问题并添加它吗?您可能还想尝试使用 -verbose
运行容器,这将显示类加载活动。
谢谢@Gary...我能够解决这个问题。正如您建议将 JAR 复制到用于单节点的 xd/lib 一样,我已将 JAR 文件复制到 yarn 访问所有其他 jar 文件的 yarn/lib 文件夹。这解决了找不到类的问题,我能够成功地将 XML 保存到 AVRO。感谢您的帮助。以上是关于springxd - 无法反序列化 [classname] Class not found的主要内容,如果未能解决你的问题,请参考以下文章
反序列化 Json 出现错误“无法反序列化当前 JSON 数组”
在身份验证期间使用 JWT 令牌反序列化 cookie 无法正确反序列化
C# Json反序列化 数据协定类型 无法反序列化 由于未找到必需的数据成员