Переменные ColdFusion отсутствуют

Хорошо, я работаю с ColdFusion 20 лет и никогда такого не видел. У меня есть сайт ContentBox (не верю, что это влияет на проблему, но я хотел включить информацию), где у меня извлекаются внешние веб-страницы, а внутренний код запускается через шлюз событий. Каждую минуту я получаю около 30 событий шлюза. Моя проблема в том, что у меня переменные исчезают в середине процедуры при запуске интерфейсных веб-страниц (обычно для извлечения данных из базы данных).

Поскольку в каталогах модулей ContenBox / ColdBox есть Application.cfcs, содержащий команды прерывания, событие шлюза cfc находится в подпапке непосредственно под корнем приложения (поскольку любое прерывание в cfc шлюза или его Application.cfc приводит к ошибке шлюза).

Точка ошибки в коде постоянно меняется. Иногда структурный ключ отсутствует ВО ВРЕМЯ перебора ключей структуры:

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

В других случаях код ссылается на структуру в области приложения, и, опять же, ключ, который присутствовал несколькими строками ранее, теперь отсутствует и вызывает ошибку. Таким образом, кажется, что различные области действия переменных (переменные, приложение и т. Д.) Теряют свои значения во время обработки веб-страницы (что часто происходит во время обработки событий шлюза).

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

Из-за договорных обязательств я не могу разместить здесь код. Тем не менее, я думаю, что описание поддается идее, что проблема не в коде CF, а в усилении защиты сервера.

Есть ли у кого-нибудь идеи, какие вещи могут привести к тому, что приложение CF потеряет переменные в середине потока?


person J G    schedule 30.08.2016    source источник
comment
Возможно, это состояние гонки. Вы оцениваете свои переменные? См. stackoverflow.com/q/19859690/1636917 и stackoverflow.com/q/36942015/1636917 и stackoverflow.com/q/27408067/1636917 для обсуждения.   -  person Miguel-F    schedule 30.08.2016
comment
Может быть состояние гонки ... особенно учитывая спорадический характер ошибок, который является классическим признаком состояния гонки. Обычно они проявляются только под нагрузкой.   -  person Leigh    schedule 31.08.2016
comment
Я почти уверен, что это не гонка. Я изменил код, чтобы поместить события шлюза сокета в отдельное приложение, и теперь моя единственная проблема заключается в ссылке на существующие переменные, которые не входят в область действия приложения. Часто, как я отмечал выше, при циклическом обходе ключей структуры. Когда я создаю цикл, я всегда использую var (хотя в моем исходном коде в посте нет ... я его редактирую). Я специально вызываю переменные по области видимости (например, variables.this [that] и т. Д.).   -  person J G    schedule 31.08.2016
comment
В качестве дополнительного примечания, иногда выдается ошибка Java: java.util.ConcurrentModificationException. Как объяснил Java-разработчик в моем офисе, это обычно происходит из-за того, что ключи удаляются, когда вы перебираете их в цикле. Тем не менее, это происходит не каждый раз, и я ничего не делаю для удаления / удаления / изменения каких-либо ключей, только subValues ​​(значения повторяемых ключей сами по себе являются структурами).   -  person J G    schedule 31.08.2016
comment
В каком-то смысле ConcurrentModificationException является условием гонки ;-) Конечно, есть и другие причины, помимо отсутствия области видимости var. (значения повторяемых ключей сами по себе являются структурами). А) Хм ... что код делает с подструктурами? Б) Являются ли структуры функцией локальными или функциональными аргументами? Потому что структуры передаются по ссылке. Хотя я понимаю, что это несвободная проблема, трудно рассуждать без большого количества кода или сообщений об ошибках. Есть ли шанс, что вы могли бы создать небольшой общий пример, например, яблоки / апельсины / груши и очищенную трассировку стека? ;-)   -  person Leigh    schedule 01.09.2016


Ответы (1)


Задача решена. Хотя состояние гонки казалось разумным, я не понимал, как это могло произойти в таком кратком цикле в одном потоке. Но это действительно была гонка. Проблема возникла из-за того, что код находится в обработчике ColdBox. Я неправильно понял использование Wirebox в этом случае. Я думал, что вызов обработчика приведет к созданию отдельного экземпляра кэшированного синглтона обработчика. Вместо этого все вызовы используют один и тот же экземпляр! Это означает, что каждый вызов обработчика разделяет область видимости переменных с другими параллельными вызовами, а не только с самим собой. Так перезаписывались переменные.

Двадцать лет ColdFusion, но первый проект с ColdBox и ContentBox. Такова жизнь.

person J G    schedule 13.09.2016