Система периодических событий на сайте (планировщик, крон, cron)

Планировщик по периоду в секундах

В системе можно задавать периодические события через хранимые процедуры. 

Каждую минуту вызывается процедура falcon_nt_sync_start (вызывается каждые N секунд по внутреннему cron механизму).

Она вызывает следующие процедуры: 

  • falcon_nt_sync_min
  • falcon_nt_sync_hour
  • falcon_nt_sync_day
  • falcon_nt_sync_week
  • falcon_nt_sync_month

Меняя код этих процедур можно выполнять необходимые проверки по базе и вызывать свои процедуры (например уведомления пользователей). 

Примечание: Для вызова используется внутренний крон, который настраивается в App Settings в web.config (или в Core версии в appsettings.json). 

Cron.Key - некий ключ, который затем проверяется в процедуре falcon_nt_sync_start (позволяет избежать случайных запусков процедуры).

Cron:PeriodSeconds - период в секундах между запусками, по умолчанию 60 секунд. 

По умолчанию процедуры пишут в trace событие вызова процедуры.

Пример процедуры start: 

ALTER PROCEDURE [dbo].[falcon_nt_sync_start]
	@key nvarchar(32)
AS
BEGIN
	-- key from config settings
	if(@key<>'KEY') begin
		select 'Error' Msg, 0 Result
		return
	end
	declare @sec int = DATEPART(SECOND, getdate()), @min int = DATEPART(MINUTE, getdate())
	declare @mins int,
		@isNextMin bit = 0,
		@curDateMins int = DATEPART(MINUTE, getdate()) + 60 * DATEPART(HOUR, getdate()) + 24* 60 + DATEPART(DAY, getdate())

	declare @temp int
	select @temp = mins from as_nt_sync where id = 1

	if(@temp = @curDateMins ) begin
		set @mins = @temp
	end else begin
		update as_nt_sync
		set mins =  @curDateMins
		where id = 1

		select @mins = mins from as_nt_sync
		where id = 1

		set @isNextMin = 1
	end


	exec as_print @str = @mins
	-- SELECT 1
	select @mins Result, 'ok' Msg

	-- SELECT 2-10 Вызов внешнего действия (они могут быть сделаны во внутр процедурах)
	/*
	select 'email' type,   -- email, sms, notification, clearcache
    	'ru@rudensoft.ru' [to], 'sub1' subject, 'bodyXXX'+@itemIDs body,   ---EMAIL
    	'Text 1' msg, '723429234' [number],   												--- SMS
        '' prefix,																				--CLEAR CACHE
		'text1' text , 'ru@rudensoft.ru' [to], 'ticketExecutor' typeCode, 'http///' url, 'add111' additional -- notification
	*/

	if(@isNextMin = 1) begin
		exec [falcon_nt_sync_min]
	end
	if(@mins %60 = 0)begin
		exec [falcon_nt_sync_hour]
	end
	if(@mins %(60 *24) = 0)begin
		exec [falcon_nt_sync_day]
	end
	if(@mins %(60 *24 * 7) = 0)begin
		exec [falcon_nt_sync_week]
	end
	if(@mins %(60 *24 * 30) = 0)begin
		exec [falcon_nt_sync_month]
	end


END

 

falcon_nt_sync_start возвращает следующие результаты: 

  • SELECT 1 - Msg, Result
  • SELECT 2-10 - вызовы внешних действий (почта, смс, уведомление и т.д.). См. вызов внешних действий. Эти SELECT могут вызываться где-то внутри периодических процедур (min, hour и т.д.). И важно - эти процедуры не должны возвращать в общий поток вывода ничего кроме подобных запросов!

ВАЖНО. Необходимо обеспечить, чтобы пул IIS никогда не отключался. 

Для этого используем настройки пула (IIS Manager, пул, Advanced Settings): 

  • In General section, at Start Mode, Select AlwaysRunning (IIS 8.5) or true for (IIS 7.5, 8)
  • In Process Model Section-> Idle Timeout(minutes) set to 0 (meaning: No Idel timeout)
  • In Recycling section -> Regular time Interval set to 0 (meaning: no recycling)

Подробнее https://stackoverflow.com/questions/18196717/quartz-net-scheduler-doesnt-fire-jobs-triggers-once-deployed

Планировщик по точному времени 

Вы можете задать в web.config параметр Cron:Schedules, например, 

<add key="Cron:Schedules" value="0 0 8 ? * MON-FRI *||0 1 19 ? * MON-FRI *||0 0/1 * * * ?"></add>

Правила перечислены через ||. Описание формата указания временных триггеров - https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontriggers.html#example-cron-expressions

На русском описание формата - https://russianblogs.com/article/1098294979/

Генератор выражений - https://ru.rakko.tools/tools/88/

Это позволит вызывать хранимую процедуру [falcon_nt_sync_schedule] в определенные моменты. 

Вид процедуры: 

CREATE OR ALTER PROCEDURE [dbo].[falcon_nt_sync_schedule]
	@key nvarchar(32)
AS
BEGIN
	-- SELECT 1 
	select 1 Result, '' msg

	-- SELECT 2 - 10 - Outer actions

	execute as_print 'test'
	print  getdate() 
END

 

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK