我在一个系统中遇到问题,大约有500台服务器通过JMS与中央服务器通信超过1000个主题。这是一个已有10年历史的系统,直到几个月前才运行良好。
在过去的3个月里,我遇到了这些类型的错误:
中央服务器无法反序列化整数,因为消息中的Integer有错误的SerialVersionID
反序列化邮件失败。 - cause:java.io.InvalidClassException:java.lang.Integer;本地类不兼容:stream classdesc serialVersionUID = 1360651450463909473,本地类serialVersionUID = 1360826667806852920
中央服务器无法反序列化未知类
反序列化邮件失败。 - cause:java.lang.ClassNotFoundException:找不到ClassLoaders:javnteger.Integer
JMS尝试实例化抽象的Number类
捕获JVM错误:java.lang.InstantiationError:java.lang.Number
对于所有错误,问题都集中在一个随机主题中。如果删除了来自该主题的消息并从服务器再次发送,则一切正常。
我怀疑是JMS硬件。硬盘还可以。我们需要测试内存,我不知道接下来要去哪里看。
有人有任何建议吗?
答案 0 :(得分:3)
这不是JVM问题。至少回到JDK 1.2(如果您认为java.lang.Integer源中的注释与JDK一起分发,实际上回到1.0.2),Integer的serialVersionUID已经是“1360826667806852920L”,它匹配您的“本地类”版本。他们从未改变它以保持向后兼容性。这个事实与“ClassNotFoundException:javnteger.Integer”(应该是java.lang.Integer)相结合,明确指出了数据损坏。发件人,接收者或网络本身都在破坏邮件。坏内存似乎可能是罪魁祸首,特别是如果它只是间歇性的,很少。如果它是网络,它可能会更频繁地发生并且不太可预测。