Переменная для хранения результатов http-запроса не определена - PullRequest
0 голосов
/ 05 октября 2010

В моем коде я делаю http-запрос (используя cfhttp) и сохраняю результат в переменной.Запрос http возвращает результаты - я знаю это, потому что я записываю время запроса и результаты.

Однако иногда что-то не так с хранением результатов http-запроса (cfhttp.filecontent) в переменной, потому что позже, когда я задаю другую переменную для первой переменной, первая переменная иногда выдаетошибка («Элемент insurance_233 не определен в структуре CFML, на которую ссылаются как на часть выражения.»).Когда я выкидываю переменную сеанса, элемент, конечно же, не существует.Я не могу понять, что вызывает ошибку.

Вот код (немного измененный, но по сути достаточно, чтобы проиллюстрировать то, о чем я говорю. Обрезка была добавлена ​​в надежде, что это будеттакже я изменил «inurance» & # myNum # на более синтаксически правильный «insurance # myNum #», но для этой иллюстрации я оставил его в исходном состоянии, чтобы показать, как это было в прошлый раз, когда ошибка былаброшен.):

<cfloop query="myQuery"> <!--- one of the query columns is myNum--->
    <cflock scope="session" type="exclusive" timeout="10">
        <cfset session.report.mydata["insurance_" & #myNum#] = cfhttp.filecontent>
    </cflock>
    <cfset request.report.mydata["insurance_" & #myNum#] = trim(session.report.mydata["insurance_" & #myNum#])>
</cfloop>

Ответы [ 4 ]

2 голосов
/ 06 октября 2010

Если это в CFC, вы написали

<cfset var myNum=0>

в какой-то момент тем же способом?

2 голосов
/ 06 октября 2010

Вы не блокируете логику, которая отвечает за установку значения myNum.Если несколько запросов обрабатываются одновременно, вы можете столкнуться со следующей ситуацией:

Request 1: sets myNum to 33
Request 1: writes data to session using myNum as the index; i.e. session[33]
Request 2: sets myNum to 34 
Request 1: reads data from session using myNum as the index; i.e. session[34]
Request 2: writes data to session using myNum as the index; i.e. session[34]

Таким образом, Запрос 1 пытается прочитать из неопределенного местоположения, потому что Запрос 2 увеличил index / myNum, ноне написал никаких данных.

2 голосов
/ 05 октября 2010

Если вы не используете CF5 или ниже, вам не нужно использовать блокировки области. Я больше не использую замки, если они не названы замками для определенного состояния гонки. Кроме того, если блокировка достигает 10 секунд без завершения записи, она полностью обойдет запись, и вы об этом не узнаете. Это, вероятно, то, что происходит. Попробуйте добавить «throwontimeout = true» в cflock, и вы получите сообщение об ошибке при превышении времени ожидания, а не просто игнорируете запись.

1 голос
/ 06 октября 2010

Приведенный выше код не дает большого контекста, но читаете ли вы сеанс из той же области приложения, из которой пишете?

...