Coldfusion - компонент не определен - PullRequest
0 голосов
/ 21 декабря 2018

Я довольно широко использую компоненты в своем приложении 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 я перезапускаю приложение при обнаружении переменной url 'init':

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

Кажется, что пока приложениеповторная инициализация, любой другой пользователь, пытающийся получить доступ к компоненту в этот момент, получит следующую ошибку (сбой компонента может отличаться).

[diag] = Элемент CFC.COMPONENT1 не определен в Javaобъект типа class [Ljava.lang.String;упоминается как ''

Есть ли что-то, что я делаю здесь неправильно, что может решить эту проблему?Я получаю эти ошибки несколько раз в день, и должно быть решение, но я не смог найти никакой информации об этой конкретной проблеме.

1 Ответ

0 голосов
/ 22 декабря 2018

Чтобы ответить на ваш вопрос, вы почти наверняка столкнетесь с условиями гонки .CF блокирует область приложения только при первом запуске приложения :

Запускается, когда ColdFusion получает первый запрос на страницу в приложении

Послечто, если вы вызываете OnApplicationStart() явно:

... ColdFusion не запускает приложение;он выполняет код метода, но не блокирует область приложения, в то время как метод выполняет .

Так что любой другой поток / запрос, пытающийся прочитать из области приложения, может получить ошибкипотому что первый поток все еще изменяет область одновременно.Вам потребуется эксклюзивное приложение cflock , чтобы предотвратить доступ любого другого потока к области действия до завершения изменений.

Как бы то ни было, хотя это не полностью исключило бы возможность условий гонки, используя отдельную переменную для инициализации и присваивая ее только после завершения, сократило бы окно возможностей для столкновений:

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

 <cfset application.someVariable = local.someVariable>

Сказав все это, я согласен, что вы определенно не не хотите так часто обновлять область приложения.

...