我在tomcat上有兩個項目。兩者都是Web應用程序。一個用作服務器,另一個用作客戶端。客戶端應用程序依賴於服務器應用程序的數據。它向服務器和服務器發送數據請求,並將數據作爲序列化的java對象進行響應。爲了消滅客戶端,提供了一個存根(從服務器流式傳輸的相同類)。Tomcat返回錯誤版本的文件
最近項目在一臺測試服務器上進行了更新。更新後的安排工作正常,但有一個問題。在瀏覽器中保存應用程序10到15分鐘後,一個特定頁面開始崩潰。在調查時發現,對於該頁面,客戶端正在向服務器請求某些數據,但服務器正在將客戶端存在的同一類的舊版本作爲存根響應。 在此10分鐘超時之前不會發生此錯誤。服務器返回與客戶端相同的類版本。我無法弄清楚在空閒時間之後,tomcat是從哪裏獲得該類的舊版本。 錯誤寶座:
`java.io.InvalidClassException: com.ABC.XYZ; local class incompatible:stream classdesc serialVersionUID = 6683390643574875053, local class serialVersionUID = 100`
爲了縮小我明確定義的serialVersionUID FOT該類100L的錯誤。
`serialVersionUID = 100L`
從服務器和客戶端打印超時類XYZ之前相同的serialVersionUID = 100,但之後的某個時間,當它崩潰,它顯示的serialVersionUID爲6683390643574875053這是編譯器生成的serialVersionUID的舊版本。
問題中的TH服務器是cantos6.3上的tomcat6.0服務器。這種安排在過去幾年的生產以及其他各種測試環境下都能夠成功運行,所以代碼很好。
如果需要,將提供進一步的細節。任何想法可能導致這一點。 在此先感謝。
即使客戶端頁面在該時間段內刷新,還是10分鐘不活動,十分鐘後是否會發生崩潰? – codeghost
10分鐘不活動。 –
當涉及到類路徑時,Tomcat有點好笑,因爲它引導了合併應用程序特定和共享類路徑,所以超載它自己。很可能你無意中在共享庫中有舊類,並且新的類在啓動時被覆蓋。在不活動之後,新的一個被卸載並且下一個使用找到共享的實例。最快的測試就是安裝一個你知道沒有共享代碼的全新TC實例,並部署你的服務器和客戶端,你不應該得到同樣的問題,然後你可以花時間調查流氓類的位置。 – codeghost