ColdFusion变量缺失

时间:2016-08-30 04:03:13

标签: struct coldfusion coldfusion-11

好的,我已经和ColdFusion合作了20年,从未见过这个。我有一个ContentBox站点(不要相信这会影响问题,但想要包含信息)我在哪里拉前端网页,后端代码通过事件网关运行。我每分钟收到大约30个网关事件。我的问题是,当前端网页运行时(通常是从数据库中提取数据),变量在中间例程中消失了。

因为ContenBox / ColdBox模块目录具有包含中止命令的Application.cfcs,所以网关事件cfc位于应用程序根目录下的子文件夹中(因为网关cfc或其Application.cfc中的任何中止都会导致网关错误)。

代码中的错误点不断变化。有时,当循环结构的键时,它不是存在的结构键:

for(var structKey in structureName)
{
    var structValue = structureName[structKey];
}

其他时候,代码引用了应用程序范围内的结构,同样,之前存在几行的键现在丢失并抛出错误。因此,在处理网页时,各种变量范围(变量,应用程序等)似乎正在丢失它们的值(这通常在处理网关事件时发生)。

Web服务器受到严密保护,我在dev / staging中没有安全问题。所以我的直觉当然是安全中的某些东西导致了这个问题。我没有在日志中看到任何可以指向我的问题。

由于合同义务,我不能在这里发布代码。也就是说,我认为该描述有助于解决问题不是CF代码,而是服务器的强化。

有没有人有什么想法会导致CF应用程序在流中丢失变量?

1 个答案:

答案 0 :(得分:1)

问题解决了。虽然竞争条件听起来很合理,但我没有看到它如何在单个线程中的这种简洁循环中发生。但事实上,这确实是一场竞争。问题产生于代码在ColdBox处理程序中的事实。在这个例子中,我误解了Wirebox的用法。我认为调用处理程序将创建处理程序的缓存单例的单个实例。相反,所有调用都使用相同的实例!这意味着处理程序的每次调用都与其他并发调用共享变量作用域,而不仅仅是它自己。这就是变量被覆盖的方式。

ColdFusion二十年,但是第一个使用ColdBox和ContentBox的项目。 C'est la vie。