JMS奇怪的问题

时间:2011-07-21 13:55:19

标签: java jms messaging deserialization

我在一个系统中遇到问题,大约有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硬件。硬盘还可以。我们需要测试内存,我不知道接下来要去哪里看。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:3)

这不是JVM问题。至少回到JDK 1.2(如果您认为java.lang.Integer源中的注释与JDK一起分发,实际上回到1.0.2),Integer的serialVersionUID已经是“1360826667806852920L”,它匹配您的“本地类”版本。他们从未改变它以保持向后兼容性。这个事实与“ClassNotFoundException:javnteger.Integer”(应该是java.lang.Integer)相结合,明确指出了数据损坏。发件人,接收者或网络本身都在破坏邮件。坏内存似乎可能是罪魁祸首,特别是如果它只是间歇性的,很少。如果它是网络,它可能会更频繁地发生并且不太可预测。