» без перевода строки: он в цепочке подключений CheckRight.asp, перевод строки попал бы в ' * начало каждого ответа (JSON, XML). ' * ' * ruserVisibilityQueueOn() ' очередь есть на этом сайте (таблица - /inc/ruser/ruser-visibility.sql) ' * ruserVisibilityEnqueue(ruserId) ' поставить (уже стоит - заново с начала); False - очереди нет ' * ruserVisibilityQueued() ' заданий в очереди (-1 - очереди нет) ' * ruserVisibilityTick ' с каждой HTML-страницы (cWebPage.doctypeWrite): раз в RUSER_VIS_TICK_SEC секунд ' * ' Server.Execute /main/ruser-visibility-tick.asp; очередь пуста - раз в ' * ' RUSER_VIS_IDLE_SEC (постановка сбрасывает таймер - сразу) ' * ' * Запуск, как у отложенных новостей: захват appStore().Claim - одна страница из параллельных; срок следующего ' * захвата ставит обработчик (ruserVisibilityNext): очередь не пуста - через RUSER_VIS_TICK_SEC, пуста - через ' * RUSER_VIS_IDLE_SEC. Отметки «пусто» навсегда нет: задание, поставленное в момент проверки, ждёт не дольше минуты. ' * ' ******************************************************************************************************** Const RUSER_VIS_TIMER = "ruserVisibility" ' захват appStore «pp|ruserVisibility» Const RUSER_VIS_TICK_SEC = 5 ' очередь не пуста - запуск со страниц раз в 5 с Const RUSER_VIS_IDLE_SEC = 60 ' очередь пуста - проверка раз в минуту (постановка - сразу) Const RUSER_VIS_OFF_SEC = 3600 ' очереди на сайте нет - раз в час ' Таблица очереди есть (проверка - раз на приложение; сбой запроса - не запоминается). Нет (другой сайт CMS, скрипт ' не выполнен) - перенос сразу, как раньше Function ruserVisibilityQueueOn() Dim v, cmd v = "" & Application("RUSER_VIS_QUEUE_ON") If v = "" Then Set cmd = New cADOCommand cmd.AddText "select case when object_id('dbo.RUSER_VISIBILITY_JOB', 'U') is null then 'N' else 'Y' end" v = "" & cmd.ExecuteScalar() If "" & cmd.LastError = "" And (v = "Y" Or v = "N") Then Application("RUSER_VIS_QUEUE_ON") = v ' одно присваивание - Lock не нужен Set cmd = Nothing End If ruserVisibilityQueueOn = (v = "Y") End Function ' Поставить задание. Уже стоит - заново с начала: правило могло смениться ещё раз (заблокировали и сразу ' разблокировали). Захват не снимается: обработчик, который сейчас работает с этим пользователем, допишет пачку, ' своё не запишет (поколение GEN сменилось), снимет захват - и задание начнётся с начала уже одним обработчиком. ' True - поставлено Function ruserVisibilityEnqueue(ByVal ruserId) ruserVisibilityEnqueue = False ruserId = GetNumValueP(ruserId, 0) If ruserId <= 0 Then Exit Function If Not ruserVisibilityQueueOn() Then Exit Function With New cADOCommand .AddText "merge dbo.RUSER_VISIBILITY_JOB with (holdlock) t using (select ? as RUSER_ID) s on t.RUSER_ID = s.RUSER_ID" .AddText "when matched then update set GEN = t.GEN + 1, STAGE = 0, CURSOR_ID = 0, DONE_ITEMS = 0, ERRORS = 0, FAILS = 0, CLAIMS = 0," .AddText " LAST_ERROR = null, C_DATE = getutcdate(), U_DATE = getutcdate()" .AddText "when not matched then insert (RUSER_ID) values (s.RUSER_ID);" .AddInt "@ID", ruserId .ExecuteNonQuery End With appStore().Remove PREPOST_STORE & RUSER_VIS_TIMER ' следующая HTML-страница сайта - сразу ruserVisibilityEnqueue = True End Function ' Заданий в очереди; -1 - очереди нет Function ruserVisibilityQueued() ruserVisibilityQueued = -1 If Not ruserVisibilityQueueOn() Then Exit Function With New cADOCommand .AddText "select count(*) from dbo.RUSER_VISIBILITY_JOB (nolock)" ruserVisibilityQueued = GetNumValueP(.ExecuteScalar(), 0) End With End Function ' Следующий запуск со страниц - не раньше чем через seconds секунд (обработчик после работы) Sub ruserVisibilityNext(ByVal seconds) appStore().ClaimNext PREPOST_STORE & RUSER_VIS_TIMER, seconds End Sub ' С каждой HTML-страницы: обычно один вызов appStore. Ошибка не ломает страницу (обработчик пишет свои ошибки сам) Sub ruserVisibilityTick() If Not appStore().Claim(PREPOST_STORE & RUSER_VIS_TIMER, RUSER_VIS_TICK_SEC) Then Exit Sub ' одна страница из параллельных On Error Resume Next Server.Execute "/main/ruser-visibility-tick.asp" Err.Clear On Error GoTo 0 End Sub %>» без перевода строки: он в цепочке подключений CheckRight.asp, перевод строки попал бы в ' * начало каждого ответа (JSON, XML). ' * ' * ruserVisibilityQueueOn() ' очередь есть на этом сайте (таблица - /inc/ruser/ruser-visibility.sql) ' * ruserVisibilityEnqueue(ruserId) ' поставить (уже стоит - заново с начала); False - очереди нет ' * ruserVisibilityQueued() ' заданий в очереди (-1 - очереди нет) ' * ruserVisibilityTick ' с каждой HTML-страницы (cWebPage.doctypeWrite): раз в RUSER_VIS_TICK_SEC секунд ' * ' Server.Execute /main/ruser-visibility-tick.asp; очередь пуста - раз в ' * ' RUSER_VIS_IDLE_SEC (постановка сбрасывает таймер - сразу) ' * ' * Запуск, как у отложенных новостей: захват appStore().Claim - одна страница из параллельных; срок следующего ' * захвата ставит обработчик (ruserVisibilityNext): очередь не пуста - через RUSER_VIS_TICK_SEC, пуста - через ' * RUSER_VIS_IDLE_SEC. Отметки «пусто» навсегда нет: задание, поставленное в момент проверки, ждёт не дольше минуты. ' * ' ******************************************************************************************************** Const RUSER_VIS_TIMER = "ruserVisibility" ' захват appStore «pp|ruserVisibility» Const RUSER_VIS_TICK_SEC = 5 ' очередь не пуста - запуск со страниц раз в 5 с Const RUSER_VIS_IDLE_SEC = 60 ' очередь пуста - проверка раз в минуту (постановка - сразу) Const RUSER_VIS_OFF_SEC = 3600 ' очереди на сайте нет - раз в час ' Таблица очереди есть (проверка - раз на приложение; сбой запроса - не запоминается). Нет (другой сайт CMS, скрипт ' не выполнен) - перенос сразу, как раньше Function ruserVisibilityQueueOn() Dim v, cmd v = "" & Application("RUSER_VIS_QUEUE_ON") If v = "" Then Set cmd = New cADOCommand cmd.AddText "select case when object_id('dbo.RUSER_VISIBILITY_JOB', 'U') is null then 'N' else 'Y' end" v = "" & cmd.ExecuteScalar() If "" & cmd.LastError = "" And (v = "Y" Or v = "N") Then Application("RUSER_VIS_QUEUE_ON") = v ' одно присваивание - Lock не нужен Set cmd = Nothing End If ruserVisibilityQueueOn = (v = "Y") End Function ' Поставить задание. Уже стоит - заново с начала: правило могло смениться ещё раз (заблокировали и сразу ' разблокировали). Захват не снимается: обработчик, который сейчас работает с этим пользователем, допишет пачку, ' своё не запишет (поколение GEN сменилось), снимет захват - и задание начнётся с начала уже одним обработчиком. ' True - поставлено Function ruserVisibilityEnqueue(ByVal ruserId) ruserVisibilityEnqueue = False ruserId = GetNumValueP(ruserId, 0) If ruserId <= 0 Then Exit Function If Not ruserVisibilityQueueOn() Then Exit Function With New cADOCommand .AddText "merge dbo.RUSER_VISIBILITY_JOB with (holdlock) t using (select ? as RUSER_ID) s on t.RUSER_ID = s.RUSER_ID" .AddText "when matched then update set GEN = t.GEN + 1, STAGE = 0, CURSOR_ID = 0, DONE_ITEMS = 0, ERRORS = 0, FAILS = 0, CLAIMS = 0," .AddText " LAST_ERROR = null, C_DATE = getutcdate(), U_DATE = getutcdate()" .AddText "when not matched then insert (RUSER_ID) values (s.RUSER_ID);" .AddInt "@ID", ruserId .ExecuteNonQuery End With appStore().Remove PREPOST_STORE & RUSER_VIS_TIMER ' следующая HTML-страница сайта - сразу ruserVisibilityEnqueue = True End Function ' Заданий в очереди; -1 - очереди нет Function ruserVisibilityQueued() ruserVisibilityQueued = -1 If Not ruserVisibilityQueueOn() Then Exit Function With New cADOCommand .AddText "select count(*) from dbo.RUSER_VISIBILITY_JOB (nolock)" ruserVisibilityQueued = GetNumValueP(.ExecuteScalar(), 0) End With End Function ' Следующий запуск со страниц - не раньше чем через seconds секунд (обработчик после работы) Sub ruserVisibilityNext(ByVal seconds) appStore().ClaimNext PREPOST_STORE & RUSER_VIS_TIMER, seconds End Sub ' С каждой HTML-страницы: обычно один вызов appStore. Ошибка не ломает страницу (обработчик пишет свои ошибки сам) Sub ruserVisibilityTick() If Not appStore().Claim(PREPOST_STORE & RUSER_VIS_TIMER, RUSER_VIS_TICK_SEC) Then Exit Sub ' одна страница из параллельных On Error Resume Next Server.Execute "/main/ruser-visibility-tick.asp" Err.Clear On Error GoTo 0 End Sub %> Дмитрий Голубков ознакомился с работой одинцовского ДОСААФ — Август
97 / 169
Дмитрий Голубков ознакомился с работой одинцовского ДОСААФ

Дмитрий Голубков ознакомился с работой одинцовского ДОСААФ

Август

Дата: Просмотры: 32