Coldfusion-组件未定义

时间:2018-12-21 14:45:49

标签: coldfusion components

我在ColdFusion应用程序中相当广泛地使用组件,并且遇到一个经常发生的错误,即我的组件未定义,尽管它们确实已定义。

我正在Application.cfc文件中定义组件。

 <cfset cfcList = "component1,component2,component3">
 <cfloop list="#cfcList#" index="local.thisCfcName">
      <cfset application.cfc[local.thisCfcName] = createObject(
        "component",
        "#application.cfcPath##local.thisCfcName#"
      )>
  </cfloop>

我能够确定的是:在我的onRequestStart函数中,遇到“ init” URL变量时,我正在重新启动应用程序:

<cfif structKeyExists(url, "init")>
  <cfset onApplicationStart()>
</cfif>

似乎在重新初始化应用程序时,任何其他尝试访问该组件的用户都会收到以下错误消息(失败的组件可能会有所不同)。

  

[diag] =元素CFC.COMPONENT1在类型为[Ljava.lang.String;称为“

我在这里做错了什么可以解决此问题吗?我每天都会几次遇到这些错误,并且必须有解决方案,但是我无法找到有关此特定问题的任何信息。

1 个答案:

答案 0 :(得分:3)

要回答您的问题,您几乎肯定会遇到race conditions。 CF仅在application first starts

时锁定应用程序范围
  

当ColdFusion收到应用程序中第一个页面请求时运行

之后,如果您明确呼叫OnApplicationStart()

  

... ColdFusion无法启动应用程序;它确实执行   方法代码,但不会在方法锁定时锁定应用程序范围   执行

因此,任何其他尝试从应用程序范围读取的线程/请求都可能会出错,因为第一个线程仍在同时修改范围。您需要一个exclusive application cflock来防止其他任何线程在完成修改之前访问范围。

顺便说一句,尽管不能完全消除竞争条件的可能性,使用单独的变量进行初始化并仅在完成时进行分配,却会减少发生冲突的机会:

 <cfloop ...> 
     <cfset local.someVariable[key] = ....>
 </cfloop>

 <cfset application.someVariable = local.someVariable>

说了这么多,我完全同意您要如此频繁地刷新应用程序范围。