我的团队在五台独立的服务器上运行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论坛上得到关于这个特殊的异常/转储的帮助,但还没有找到遇到同样事情的人。
其他人有什么想法吗?这个错误困扰着我,因为它不会触发我们的正常异常处理,因此我们不需要人为干预就可以做很多事情。感谢您的任何具体指导。
所以当接下来发生这种情况时,请查看您的cfclasses文件夹。 cfezReporting2ecfc400556386.class)或下次调用的任何文件系统中有最近修改过的日期吗?另外,你的群集设置是什么?你有没有开启粘性会议?你有开启会话复制吗?是被调用的对象在像服务器,应用程序或会话这样的长时间范围内保存吗? – barnyr 2012-07-30 14:46:11
感谢您澄清问题。 我将在下次发生时检查类文件的存在。没有真正的聚类;这些实例彼此分开,并且我们不使用粘性会话会话复制。此外,到目前为止调用的'missing'对象是简单的cfincluded cfm文件或通过cfinvoke从调用模板调用的静态CFC。这些情况下没有涉及服务器/应用程序/会话范围的CFC。 – Chris 2012-07-30 18:15:13
我记得今天早上我在这个状态下离开了一个测试服务器,以防万一。有问题的类文件的日期为2012年3月1日(cfc自2011年以来未更新)。当我清除模板缓存时,类文件收到今天的日期。 – Chris 2012-07-30 18:30:27