Coldfusion CreateObject() 返回错误对象的实例

问题描述 投票:0回答:1

我遇到了一个似乎只影响我们的生产服务器的问题,没有任何明显的规律或原因。本质上,我们收到以下错误(我将使用虚拟名称来说明这一点):

消息:在组件 Components.services.SomeComponent 中找不到方法 someFunction,也没有在任何实现接口中存在任何具有此名称的默认方法。

这种情况发生在代码库中的几行不同的地方,但一旦被抛出,它将永远不会再超过该点直到清除CFADMIN中的组件缓存。关键在于:代码中的违规行如下所示:

<cfset var a = createObject("Components.services.app.ComponentA").someFunction() >

创建

ComponentA
createObject 调用似乎返回了 SomeComponent 的实例。我尝试过以下方法:

  • 本节中的 CreateObject 调用had一直在为组件路径使用动态创建的字符串...我想也许有些东西被污染了,所以现在
    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
  • 清除组件缓存似乎可以解决这个问题,这一事实确实让我对组件缓存产生了怀疑……我只是对 CF 的了解不够,无法了解 为什么 缓存可能会返回一个实例与它所调用的对象不同的对象

后续步骤(这些都不理想):

  • 完全禁用组件缓存,不想受到性能影响
  • 添加一些荒谬的代码,以便在抛出无效方法名称错误时以编程方式清除组件缓存

是否有某种方法可以精细地排除从组件缓存中检索某些 CFC,并在调用 createObject() 时强制重新评估它们?

coldfusion cfc createobject coldfusion-2021
1个回答
0
投票

操作系统级别上是否有任何符号链接将您的

ComponentA|B|C
等链接到
someComponent
someOtherComponent 

您的应用程序是否有唯一的应用程序名称(Application.cfc 中的

this.name
)?如果没有,它可能会与其他同名的应用程序共享相同的
./Components/services/app
,但它们指向不同的文件夹

如果您的应用程序中有某种初始化/重新加载机制,是否会由于多个初始化/重新加载请求同时运行而导致出现此问题? (我认为这不太可能,但奇怪的事情可能会这样发生......)

© www.soinside.com 2019 - 2024. All rights reserved.