2012-07-30 52 views
3

我的團隊在五臺獨立的服務器上運行ColdFusion(v9)。其中三個是負載平衡路由器,另外兩個是開發和測試機器。ColdFusion - 丟失的類文件= JRun錯誤

幾個月前,我們開始遇到某些頁面/模板請求失敗的問題。當我說失敗時,我的意思是服務器會返回500錯誤。但是,錯誤而不是通過cftry/cfcatch和cferror觸發我們的ColdFusion異常處理。

檢查HTTP頭後,它看起來像某種jrun錯誤,所以我進入異常日誌。下面是一個錯誤的例子(這個今天上午發生):

"Error","jrpp-1","07/30/12","06:30:02",,"(class: cfezReporting2ecfc400556386, method: runPage signature:()Ljava/lang/Object;) Incompatible object argument for function call The specific sequence of files included or processed is: X:\docs\ezBuilder\index.cfm'' " 
java.lang.VerifyError: (class: cfezReporting2ecfc400556386, method: runPage signature:()Ljava/lang/Object;) Incompatible object argument for function call 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
    at java.lang.Class.getConstructor0(Class.java:2699) 
    at java.lang.Class.newInstance0(Class.java:326) 
    at java.lang.Class.newInstance(Class.java:308) 
    at coldfusion.runtime.TemplateClassLoader.newInstance(TemplateClassLoader.java:552) 
    at coldfusion.runtime.TemplateClassLoader.newInstance(TemplateClassLoader.java:523) 
    at coldfusion.runtime.TemplateProxyFactory.getCFCInstance(TemplateProxyFactory.java:270) 
    at coldfusion.runtime.TemplateProxyFactory.resolveName(TemplateProxyFactory.java:173) 
    at coldfusion.runtime.TemplateProxyFactory.resolveName(TemplateProxyFactory.java:158) 
    at coldfusion.runtime.TemplateProxyFactory.resolveName(TemplateProxyFactory.java:148) 
    at coldfusion.cfc.ComponentProxyFactory.getProxy(ComponentProxyFactory.java:62) 
    at coldfusion.tagext.lang.InvokeTag.doEndTag(InvokeTag.java:373) 
    at cfezBuilder2ecfc293785079$funcCREATE_UVN._factor7(X:\docs\ezBuilder\components\ezBuilder.cfc:376) 
    at cfezBuilder2ecfc293785079$funcCREATE_UVN.runFunction(X:\docs\ezBuilder\components\ezBuilder.cfc:327) 
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) 
    at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405) 
    at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368) 
    at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) 
    at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) 
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:517) 
    at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:2547) 
    at coldfusion.tagext.lang.InvokeTag.doEndTag(InvokeTag.java:460) 

一次在模板時發生這個錯誤,它會不斷髮生,即它不是零星的,沒有「自我修復」。

另一個有趣的事情是,這個錯誤似乎發生在同一個文件上的所有服務器上。同時,我的意思是當我們收到有人發現錯誤的通知時,我們測試了其他服務器並發現它們也出錯。

無法在任何地方找到有關此特定錯誤詳細信息的幫助,我猜測ColdFusion無法找到模板或類文件。我檢查了每臺服務器和.cfc文件(還有,'找不到模板'的異常總是不一樣)。

因此,我對文件(上例中的ezReporting.cfc)進行了更改,並將其複製到所有服務器,並且看它工作正常。這個改變只是簡單地添加,然後刪除一個空格 - 我猜,基本上是強制模板重新編譯。每次發生錯誤時,我都會在接下來的幾周內每次都這樣做。它總是在.cfc文件上。

下一次發生錯誤,大約一週後,它在完全相同的文件上。這一次,我清除了服務器上的模板緩存,而不是實際更改模板。它再次運作。

從那以後,在幾個不同的文件(CFC和CFM文件)上出現同樣的錯誤。 (a)文件的「年齡」/最後更新日期 - 從一天到一年的所有內容,(b)文件的內容 - 從簡單塊到SQL查詢到一些基本設置/循環,或(c)文件的名稱。

今天早上,它發生在另一個文件上,我知道兩天前在所有服務器上都工作過。自去年以來,CFC文件內容在任何服務器上都沒有被觸及。而且,當我去到所有五臺服務器時,完全相同的文件都失敗了。當我清除模板緩存時,每臺服務器都再次開始工作。

我正在給所有這些無聊的細節,因爲我正在尋找任何可以幫助的東西。也許文件本身會出現某種失效,這就可以解釋爲什麼文件在同一時間在所有服務器上過期 - 我們在開發服務器上對其進行更改,然後將其移出到測試和生產服務器上一個簡單的複製/粘貼。但是,似乎沒有任何韻律或期限的理由,因爲如上所述,所討論的文件具有不同的年齡。

我試着在Adobe論壇上得到關於這個特殊的異常/轉儲的幫助,但還沒有找到遇到同樣事情的人。

其他人有什麼想法嗎?這個錯誤困擾着我,因爲它不會觸發我們的正常異常處理,因此我們不需要人爲干預就可以做很多事情。感謝您的任何具體指導。

+3

所以當接下來發生這種情況時,請查看您的cfclasses文件夾。 cfezReporting2ecfc400556386.class)或下次調用的任何文件系統中有最近修改過的日期嗎?另外,你的羣集設置是什麼?你有沒有開啓粘性會議?你有開啓會話複製嗎?是被調用的對象在像服務器,應用程序或會話這樣的長時間範圍內保存嗎? – barnyr 2012-07-30 14:46:11

+0

感謝您澄清問題。 我將在下次發生時檢查類文件的存在。沒有真正的聚類;這些實例彼此分開,並且我們不使用粘性會話會話複製。此外,到目前爲止調用的'missing'對象是簡單的cfincluded cfm文件或通過cfinvoke從調用模板調用的靜態CFC。這些情況下沒有涉及服務器/應用程序/會話範圍的CFC。 – Chris 2012-07-30 18:15:13

+0

我記得今天早上我在這個狀態下離開了一個測試服務器,以防萬一。有問題的類文件的日期爲2012年3月1日(cfc自2011年以來未更新)。當我清除模板緩存時,類文件收到今天的日期。 – Chris 2012-07-30 18:30:27

回答

2

正如Barney所說,你經歷了一個損壞的模板緩存。清除/ cfclasses文件夾中的文件可能是一個很好的起點 - 然後檢查文件系統的運行狀況(整理和所有這些)。加載類可能有文件I/O問題。這些類和而不是 .cfm文件真的是由您的Web服務器「運行」。

唯一令我失望的是錯誤「同時發生」。你有某種預編譯過程嗎?是否所有的站點都在NAS上共享相同的物理代碼庫?這是我看起來很奇怪的部分。

+0

我同意。我們沒有進行預編譯 - 我們只需複製例如從一臺服務器到另一臺服務器的cfm文件。我想也許同時發生的事情與類文件在其源cfm/cfc文件創建日期之後「過期」設置時間/日期有關,但除此之外沒有關聯。 – Chris 2012-07-30 18:20:26

+0

如果有辦法過期的功能我不知道的類文件。還有什麼應該考慮這些文件?複雜的ACL?病毒掃描?我不會爲你提供很多 - 對不起。 – 2012-07-30 21:32:34

+0

我與馬克,我不知道什麼可能會造成這種情況。一個想法是:你的應用程序超時設置爲?你在ApplicationStart或onApplicationStop上記錄什麼可能會留下線索? – barnyr 2012-07-31 10:17:24

1

我有同樣的問題,但不幸的是永遠無法修復它。一個空間技巧完全相同,對每次重新編譯都進行了微小的修改。

+0

感謝至少驗證它發生在別人身上。我很欣賞它對我們的設置不完全獨特。 – Chris 2012-08-02 20:03:27

0

對於任何有此相同問題的人,我想添加一個最近工作過的僞「解決方案」。我說這是僞造的,因爲它沒有解決我仍然不知道的根本問題。但它確實允許應用程序從錯誤中恢復。

總之,ColdFusion <cfcatch>,即使type =「any」,也不會捕獲從JRE拋出的錯誤。但是,可以通過< cfcatch type =「java.lang.VerifyError」>來捕獲此特定錯誤。

在那個cfcatch中,我使用我的管理員函數使用clearComponentCache()和clearTrustedCache()方法清除模板緩存。然後,我不會複製剛剛失敗的代碼,而是爲用戶返回相同的URL以再次嘗試。

轉發用戶在此特定應用程序中工作時,對於諸如ajax調用的情況可能會有問題;然而,在這種情況下,我認爲可以簡單地重新包括cfms或重新調用第一次出錯的CFC。

讓我知道這是否適用於您或其他人找到了更好的解決方案。