cflock не выдает тайм-аут для того же URL-адреса, который вызывается в том же браузере

Я пытаюсь заблокировать блокировку на странице test.cfm, и ниже приведен код, написанный на странице.

<cfscript>
writeOutput("Before lock at #now()#");
lock name="threadlock" timeout="3" type="exclusive"
{
    writeOutput("<br/>started at #now()#");
    thread action="sleep"  duration="10000";
    writeOutput("<br/>ended at #now()#");
}
writeOutput("<br/>After lock at #now()#");
</cfscript>

предполагая, что мой URL-адрес страницы http://localhost.local/test.cfm и запустить его в браузере в две разные вкладки. Я ожидал, что один из URL-адресов выдаст ошибку тайм-аута через 3 секунды, поскольку другой URL-адрес заблокирует его как минимум на 10 секунд из-за спящего режима потока. Удивительно, но я не получаю никакой ошибки тайм-аута, а второй вызов страницы запускается через 10 секунд, так как первый вызов завершает выполнение.

Но я добавляю некоторый параметр URL-адреса (например, http://localhost.local/test.cfm?q=1) выдаст ошибку. Также я вызываю тот же URL-адрес в другом браузере, тогда один из вызовов вызовет проблему тайм-аута.

Блокировка основана на сеансе и URL-адресе?

Обновление Здесь выводятся данные для двух разных случаев:

Случай 1:

TAB1 URL-адрес: http://localhost.local/test/test.cfm

 Before lock at {ts '2013-10-18 09:21:35'} 
 started at {ts '2013-10-18 09:21:35'} 
 ended at {ts '2013-10-18 09:21:45'} 
 After lock at {ts '2013-10-18 09:21:45'}

TAB2 URL-адрес: http://localhost.local/test/test.cfm

Before lock at {ts '2013-10-18 09:21:45'} 
started at {ts '2013-10-18 09:21:45'}
ended at {ts '2013-10-18 09:21:55'} 
After lock at {ts '2013-10-18 09:21:55'}

Вариант 2:

TAB1 URL-адрес: http://localhost.local/test/test.cfm

 Before lock at {ts '2013-10-18 09:27:18'} 
 started at {ts '2013-10-18 09:27:18'} 
 ended at {ts '2013-10-18 09:27:28'} 
 After lock at {ts '2013-10-18 09:27:28'}

TAB2 URL-адрес: http://localhost.local/test/test.cfm? (Добавлено? в конце)

Before lock at {ts '2013-10-18 09:27:20'} 
A timeout occurred while attempting to lock threadlock.
The error occurred in C:/inetpub/wwwroot/test/test.cfm: line 13
11 : 
12 : <cfoutput>Before lock at #now()#</cfoutput>
13 : <cflock name="threadlock" timeout="3" type="exclusive">
14 :    <cfoutput><br/>started at #now()#</cfoutput>    
15 :    <cfthread action="sleep"  duration="10000"/> 
...

Результат для случая 2, как и ожидалось.

Для случая 1 странная вещь, которую я только что заметил, это вывод вкладки 2 «Перед блокировкой в ​​{ts '2013-10-18 09:21:45'} указывает, что весь запрос начинается через 10 секунд (означает после полного выполнения первой вкладки) когда я запустил его во втором URL-адресе сразу после 2 секунд первых вкладок.


person Pritesh Patel    schedule 17.10.2013    source источник
comment
Нет, он не разделяет сеанс между двумя разными браузерами. Я имею в виду, что тайм-аут выдает для другого сеанса или другого URL-адреса, но не только для одного и того же URL-адреса в одном сеансе.   -  person Pritesh Patel    schedule 17.10.2013
comment
Я подозреваю, что это основано на запросе. Каждая вкладка — это отдельный запрос. Блокировка одного не влияет на другой.   -  person James A Mohler    schedule 17.10.2013
comment
@JamesMohler, если это база запросов, то она должна генерировать ошибку после ожидания в течение 3 секунд, верно? но это не так   -  person Pritesh Patel    schedule 17.10.2013
comment
Для меня это звучит как проблема с кешированием браузера, когда вы открываете новую вкладку. Это объясняет, почему добавление параметра URL заставит его работать. Время вывода обновляется при открытии новой вкладки? Отслеживайте сетевой трафик при тестировании и смотрите, отправляется ли запрос даже при открытии новой вкладки.   -  person Miguel-F    schedule 17.10.2013
comment
Согласно комментарию и ссылке Питера, имя cflock является глобальным, а не по запросу.   -  person James A Mohler    schedule 17.10.2013
comment
@ Miguel-F Это не может быть проблема с кэшированием, так как оно отключено в coldfusion.   -  person Pritesh Patel    schedule 17.10.2013
comment
@JamesMohler верно, он глобальный, поэтому он должен выдавать ошибку тайм-аута для того же URL-адреса, который вызывается на другой вкладке браузера.   -  person Pritesh Patel    schedule 17.10.2013
comment
@PriteshPatel Я имею в виду не кэширование ColdFusion, а кэширование в браузере. Фактически, браузер может даже не вызывать ваш сервер ColdFusion, когда вы открываете новую вкладку.   -  person Miguel-F    schedule 17.10.2013
comment
Вы можете поместить `‹cfoutput›#now()#‹/cfoutput› на страницу.   -  person James A Mohler    schedule 17.10.2013
comment
Притеш: просто чтобы подтвердить, ваш код работает именно так, как вы ожидаете в моей тестовой среде, так что код надежный. Вы открываете страницу через внешний веб-сервер, такой как Apache или IIS? Что, если вы повторите эксперимент, используя встроенный веб-сервер, поставляемый с CF? Мне кажется, что что-то однопоточное выполняет ваши запросы. Можете ли вы опубликовать точный результат нажатия URL-адреса с разницей в пару секунд на двух разных вкладках? Я просто хочу подтвердить, как время вывода смешивается, если вообще.   -  person Adam Cameron    schedule 17.10.2013
comment
И также, пожалуйста, подтвердите, здесь не работает другой код, кроме того, что вы нам показываете? Включая Application.cfc или аналогичный.   -  person Adam Cameron    schedule 17.10.2013
comment
@ Miguel-F Это определенно не проблема кэширования браузера, так как я печатаю текущее время и каждый раз разное. Я обновил вопрос с выводом, который я получаю для двух случаев.   -  person Pritesh Patel    schedule 18.10.2013
comment
@AdamCameron: Думаю, это проблема с однопоточностью. Добавлен вывод для обоих случаев. И да, для первого случая запрос начинается после окончания первого (наблюдение перед блокировкой в... в выводе). Я использую IIS для CF, но пробовал встроенный веб-сервер для RAILO, но та же проблема. Попробую встроенный CF.   -  person Pritesh Patel    schedule 18.10.2013
comment
Сделай одолжение... попробуй код, но без замка. Он все еще однопоточный?   -  person Adam Cameron    schedule 18.10.2013
comment
да, я уже пробовал это ... :) Удивительно, но вчера утром я не заметил вывода, но только сегодня утром я пробежал ту же страницу, понял это, а затем прочитал ваш комментарий. Иногда давать перерыв разуму работает.   -  person Pritesh Patel    schedule 18.10.2013


Ответы (1)


Я видел такое поведение в Chrome раньше. Если одна вкладка выполняет запрос к заданному URL-адресу, другие вкладки будут ждать завершения первой вкладки, а затем немедленно вернутся.

Вот доказательство концепции, которую я могу постоянно воспроизводить в своем браузере Chrome.

foo.cfm

<cfoutput>#now()#</cfoutput>
<cfscript>
    sleep(5000);
</cfscript>
<cfoutput>#now()#</cfoutput>

Откройте две вкладки в браузере, чтобы открыть foo.cfm.

Тест 1: выполните следующую последовательность так быстро, как только сможете, без ошибок. Нажмите tab1, выберите строку URL, нажмите клавишу ввода. Нажмите tab2, выберите строку URL, нажмите клавишу ввода.

При этом вы заметите, что метки времени на первой странице разделены на 5 секунд, и вы заметите, что метка времени на второй странице даже не началась, пока не закончилась первая.

Тест 2: выполните следующую последовательность так быстро, как только сможете, без ошибок. Нажмите tab1, нажмите ctrl+f5, нажмите tab2, нажмите ctrl+f5.

Теперь обратите внимание, что вкладка два завершится почти сразу после вкладки 1, а временные метки указывают на то, что обработка занимала столько же времени, сколько вам потребовалось для переключения вкладок.

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

person Nucleon    schedule 18.10.2013
comment
OMG, я думал, что это сервер (IIS) выполняет один поток для каждого клиента. Я тестировал дальше в другом браузере, и Chrome и Firefox ведут себя одинаково, но IE (да, IE) работает нормально и выдает ошибку. - person Pritesh Patel; 19.10.2013