2012-07-30 51 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。

让我知道这是否适用于您或其他人找到了更好的解决方案。