【问题标题】:springxd - unable to deserialize [classname] Class not foundspringxd - 无法反序列化 [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}]}}

感谢您的帮助...

谢谢, 阿杰

【问题讨论】:

    标签: java hdfs avro spring-xd


    【解决方案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。感谢您的帮助。
    猜你喜欢
    • 2011-06-15
    • 2017-08-04
    • 1970-01-01
    • 2019-07-08
    • 2019-09-22
    • 2013-11-10
    • 2011-11-06
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多