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

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

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

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

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

  • as_nt_sync_min
  • as_nt_sync_hour
  • as_nt_sync_day
  • as_nt_sync_week
  • as_nt_sync_month

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

Примечание: Для вызова раньше мы использовали сервисы наподобие https://cron-job.org.  Теперь используется внутренний крон, который настраивается в App Settings в web.config. 

Cron.Key - некий ключ, который затем проверяется в процедуре as_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

as_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

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

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