2011-07-21 37 views
1

我的系統有一個問題,其中約500個服務器通過JMS超過1000個主題與中央服務器通信。這是一個有10年曆史的系統,它在幾個月前運行良好。JMS奇怪的問題

在過去的3個月,我有這些類型的錯誤:

  • 中心服務器無法反序列化整數,因爲整數消息中有錯誤SerialVersionID

    Deserialize message failed. - cause: java.io.InvalidClassException: java.lang.Integer; local class incompatible: stream classdesc serialVersionUID = 1360651450463909473, local class serialVersionUID = 1360826667806852920

  • 中央服務器可以」 t反序列化未知類

    Deserialize message failed. - cause: java.lang.ClassNotFoundException: No ClassLoaders found for: javnteger.Integer

  • JMS嘗試實例數類,這是抽象的

    Caught JVM Error: java.lang.InstantiationError: java.lang.Number

對於問題在一個隨機話題本地化的所有錯誤。如果來自該主題的消息被刪除並再次從服務器發送,則一切正常。

我懷疑JMS硬件。硬盤沒問題。我們需要測試記憶,我不知道接下來要看的地方。

任何人有任何建議?

+3

任何升級到JVM? –

+1

第二次反序列化錯誤,您是否複製/粘貼或者真的引用了一個名爲javnteger.Integer的類? – Perception

+2

這*真的*聞起來像您的不同服務器之間的JVM版本不匹配。像Damokles說的那樣,他們最近是否對你園區中的任何服務器進行過任何JVM升級?另外,第2點(如果它確實應該是javnteger.Integer)看起來像一個典型的IDE導致的錯誤。有人編寫了應該使用java.lang.Integer的代碼,但意外地導入了另一個javnteger.Integer類,這是接收服務器不知道的。 – pap

回答

3

這不是JVM問題。至少回到JDK 1.2(實際上回到1.0.2,如果你相信java.lang.Integer源代碼中的評論與JDK一起發佈),Integer的serialVersionUID就是「1360826667806852920L」,它與你的「本地類」版本相匹配。他們從未改變它以保持向後兼容性。這個事實與「ClassNotFoundException:javnteger.Integer」(應該是java.lang.Integer)結合在一起,明確地指向了數據損壞。發送者,接收者或網絡本身都在破壞消息。糟糕的內存似乎是一個可能的罪魁禍首,特別是如果它只是間歇性和很少。如果是網絡,它可能會更頻繁地發生並且不太可預測。