【发布时间】:2016-08-30 04:03:13
【问题描述】:
好的,我已经与 ColdFusion 合作了 20 年,但从未见过这种情况。我有一个 ContentBox 站点(不相信这会影响问题,但想包含信息),其中我有前端网页被拉出并通过事件网关运行后端代码。我每分钟收到大约 30 个网关事件。我的问题是,当前端网页运行(通常是从数据库中提取数据)时,我的变量在例程中消失了。
因为 ContenBox/ColdBox 模块目录的 Application.cfcs 包含中止命令,网关事件 cfc 位于应用程序根目录下的子文件夹中(因为网关 cfc 或其 Application.cfc 中的任何中止都会导致网关错误)。
代码中的错误点是不断变化的。有时它是结构键不存在而循环遍历结构的键:
for(var structKey in structureName)
{
var structValue = structureName[structKey];
}
其他时候,代码引用了应用程序范围内的结构,同样,前几行出现的键现在丢失并引发错误。因此,似乎各种变量范围(变量、应用程序等)在处理网页时正在失去它们的值(这通常在处理网关事件时发生)。
网络服务器受到严格保护,我在开发/暂存中没有不安全的问题。因此,我的直觉当然是安全中的某些东西导致了这个问题。我在日志中没有看到任何可以指出问题的内容。
由于合同义务,我无法在此处发布代码。话虽如此,我认为这个描述本身就是一个想法,即问题不在于 CF 代码,而在于服务器的加固。
有没有人知道什么样的事情会导致 CF 应用程序在中途丢失变量?
【问题讨论】:
-
可能是竞争条件。您是否在确定变量的范围?请参阅stackoverflow.com/q/19859690/1636917、stackoverflow.com/q/36942015/1636917 和stackoverflow.com/q/27408067/1636917 进行一些讨论。
-
可能是竞争条件 ...特别是考虑到错误的零星性质,这是竞争条件的典型症状。通常,它们仅在负载下才会显现。
-
我很确定这不是竞争条件。我更改了代码以将套接字网关事件放在单独的应用程序中,现在我唯一的问题是引用不在应用程序范围内的现有变量。通常,正如我上面提到的,在遍历结构的键时。当我创建循环时,我总是使用 var (尽管我在帖子中的原始代码位没有......我正在编辑它)。我专门按范围调用变量(例如 variables.this["that"] 等)。
-
作为补充说明,有时抛出的错误是 Java 错误:java.util.ConcurrentModificationException。正如我办公室的一名 Java 开发人员所解释的那样,这通常是由于在循环访问密钥时删除了密钥。也就是说,它不会每次都发生,而且我没有做任何事情来删除/删除/更改任何键,只有 subValues(被迭代的键的值本身就是结构)。
-
在某种程度上 ConcurrentModificationException is 是一种竞争条件 ;-) 当然,除了缺少 var 作用域之外,还有其他原因。 (被迭代的键的值本身就是结构)。 A) 嗯...代码对子结构做了什么? B)结构是“函数本地”还是函数参数?因为结构是通过引用传递的。虽然我可以理解“专有”问题,但如果没有太多代码或错误消息,很难推测。您是否有机会伪造一个小的通用示例,即“apples/oranges/pears”和“scrubbed”堆栈跟踪? ;-)
标签: struct coldfusion coldfusion-11