我遇到了一个似乎只影响我们的生产服务器的问题,没有任何明显的规律或原因。本质上,我们收到以下错误(我将使用虚拟名称来说明这一点):
消息:在组件 Components.services.SomeComponent 中找不到方法 someFunction,也没有在任何实现接口中存在任何具有此名称的默认方法。
这种情况发生在代码库中的几行不同的地方,但一旦被抛出,它将永远不会再超过该点直到清除CFADMIN中的组件缓存。关键在于:代码中的违规行如下所示:
<cfset var a = createObject("Components.services.app.ComponentA").someFunction() >
创建
ComponentA的
createObject
调用似乎返回了 SomeComponent 的实例。我尝试过以下方法:
Components.services.app.ComponentA
、Components.services.app.ComponentB
等...都是硬编码的new
语法而不是 createObject
./Components/services/app
的映射,称为(例如)“app”,这样我就可以创建像 new app.ComponentA()
这样的对象而不是new Components.services.app.ComponentA
似乎没有什么帮助——这些在我们的 UAT 或任何人的开发环境中都无法重现,并且在生产中是间歇性的,但是,一旦抛出,服务器就完成了。清除 CFADMIN 中的组件缓存可以暂时修复它,直到几个小时后有人再次随机抛出它。
一些额外的注意事项:
new ComponentC()
而是创建 someComponent
... new ComponentA()
正在创建 someOtherComponent
someComponent
、someOtherComponent
)是位于该目录之外的 CFC 后续步骤(这些都不理想):
是否有某种方法可以精细地排除从组件缓存中检索某些 CFC,并在调用 createObject() 时强制重新评估它们?
操作系统级别上是否有任何符号链接将您的
ComponentA|B|C
等链接到 someComponent
或 someOtherComponent
?
您的应用程序是否有唯一的应用程序名称(Application.cfc 中的
this.name
)?如果没有,它可能会与其他同名的应用程序共享相同的./Components/services/app
,但它们指向不同的文件夹
如果您的应用程序中有某种初始化/重新加载机制,是否会由于多个初始化/重新加载请求同时运行而导致出现此问题? (我认为这不太可能,但奇怪的事情可能会这样发生......)