Как я могу выполнять события на основе времени/запланированные события в .NET?

Мне нужно предложить расписание действий/событий на нашем веб-сайте. Гарпусная аналогия может быть системой календаря, где человек добавляет элемент календаря, а когда дата/время "ударяется", тогда запускается некоторая логика (например, вычисление отчета).

У меня могут быть сотни и даже тысячи запланированных событий, которые вводят мои клиенты. Когда клиент вводит что-то для планирования, я сохраню эту информацию в базе данных. Тогда я предполагаю, что я добавлю какое-то событие/работу где-нибудь, в котором будет содержаться первичный ключ таблицы базы данных. когда событие должно быть уволено, я захвачу эту информацию из db, а затем сделаю логику. сделал.

Каковы некоторые общие решения для этого?

Я использую .NET 3.5 SP1. DB - это Sql Server 2008. UI будет веб-узлом.

Я не был уверен, используют ли люди MSMQ? Или что-то встроенное в Sql Server? Или в библиотеке с открытым исходным кодом (например, Quartz.NET) с помощью службы NT. Сервер будет стандартным выпуском Windows 2008.

Также - пожалуйста, не предлагайте использовать эквивалент задания cron или любые сценарии командной строки и т.д.

Наконец, и это второстепенная цель. Я бы хотел бросить это на лазурь для шиза и хихиканья... так же возможно? это только идея списка пожеланий. Я бы предпочел сделать это в выделенной области, если решение проще, чем использование Azure.

cheers:)

edit: Логика для обработки, когда событие требуется для запуска, - это фоновые задания. Пользовательский интерфейс не требуется.

+8
источник поделиться
8 ответов

Quartz.NET, вероятно, также может справиться с этими требованиями достаточно хорошо. Преимущества, которые я вижу, - это различные способы настройки планировщика (календари CronTrigger +) и возможность выполнять ваши задания в небольших единицах тестируемого кода (задания).

Quartz.NET также предоставляет необходимые функции распределения и сбоя с функциями кластеризации. Одной из приятных функций является настройка настраиваемых пропусков зажигания для каждого триггера, которая дает вам возможность реагировать на пропуски зажигания и время простоя планировщика.

SQL Service Broker, по-видимому, имеет преимущество без опроса, я задаюсь вопросом, будет ли это когда-либо проблемой, но у брокера есть недостаток, который звучит немного сложнее (по крайней мере, из описания, которое я прочитал выше).

Просто мои предвзятые $0,02.

+2
источник

Workflow Foundation может это сделать. Используйте Delay activity, установите TimeSpan (DesiredTimeOfExecution - Now). Для систем большего масштаба установите для параметра UnloadOnIdle значение true, а ожидающие рабочие процессы будут сохраняться до тех пор, пока это не понадобится.

Здесь очень простой пример активности задержки.

WF Free, входящий в состав .NET Framework 3.0.

+4
источник

Что вы хотите, так это SQL Server Service Broker.

Вы можете делать доступ к базам данных по запросу для данных календаря и т.д. Он основан на сообщениях, более мощный, чем MSMQ, не требует опроса и может использоваться в распределенных средах, если это вам нужно. Отлично работает для меня!

Вы попадете в хранимую процедуру, чтобы поместить свою информацию о событии в очередь SSB в db. Вы дадите этому сообщению время в будущем, чтобы проснуться и обработать другую хранимую процедуру, которая захватывает ваши данные о событиях и помещается в очередь пикапа, которая выполняет "внешнюю активацию". EA отправляет уведомление службе Windows, которая указывает на консольное приложение. Это консольное приложение захватывает информацию о событии из очереди пикапа. Теперь у вас есть данные о событиях в то время, когда вы этого хотите. Обработайте его, как вам нравится, в консольном приложении.

Существует кривая обучения, но она стоит того, если вам нужна надежность, гибкость и масштабируемость, предлагаемые SQL Service Broker. Ниже приведены некоторые ссылки, которые помогут вам начать работу.

Здесь сравнение: SQL Service Broker против MSMQ

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

Надеюсь, это поможет!

+2
источник

Один из вариантов может заключаться в создании задания SQL для работы с любым наиболее гранулированным интервалом, который у вас есть, и обработкой всех ваших событий.

Если вы хотите использовать лучшие из миров .NET и SQL Server, вы можете использовать задания SQL и вызывать управляемый код. У меня нет опыта в этом решении, поэтому я извиняюсь перед тем, если предоставленный мной ресурс не очень тщателен.

Если задачи очень сложны и вы не хотите загружать сборки на SQL Server или вам просто не нравится их система планирования, я бы рекомендовал .NET Windows Service с плагином сторонних разработчиков. Лично, если бы весь код мог храниться в хранимой процедуре или в серии хранимых процедур, я бы сделал работу, поскольку я думаю, что это намного проще в управлении, и большая часть работы уже сделана для вас.

Edit

Я только заметил комментарий, который объяснил детализацию. Если у вас есть какие-то действия, которые нужно выполнять каждую минуту, то решение .NET Service, вероятно, будет проще, так как вам, вероятно, придется реализовать какое-то многопоточное решение.

+1
источник

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

Это облегчает работу планировщика. У вас должна быть таблица DB, в которой хранятся ваши задания, и с каждой минуты у вас есть служба планировщика заданий, перейдите в эту таблицу и выберите задания, которые необходимо выполнить.

Он закроет эти задания менеджером заданий. Вы можете использовать другую таблицу или транзакционную очередь для размещения вашей работы. Служба менеджера заданий будет отслеживать очередь заданий. Вы можете использовать свои собственные или использовать BizTalk для контроля очереди заданий и запуска оркестровки или рабочий процесс. Он поочередно вытаскивает задания из очереди, выполняет задачи и обновляет состояние задания в БД.

Ваша проблема будет масштабируема в зависимости от количества пользователей, количества задач, которые они ставят в очередь, и насколько интенсивной (время, память, процессор и т.д.) разрешена каждая задача. Если бы я был вами, я бы отбросил назад на 1 минуту гранулярность и надавил на 5 минут. Что вам нужно сделать в 1:38 вечера. что вы не можете дождаться 1:40 вечера. для?:)

+1
источник

Это уже обсуждаемая проблема в StackOverflow. перейдите Требуется планировщик заданий в asp.net

Вы забыли добавить самую важную часть информации в свой вопрос - ASP.Net

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

Кроме того, это самый дешевый из всех альтернатив. Надеюсь, это то, что вам нужно.

+1
источник

Это немного зависит от характера системы. Исходя из предположения, что полное определение событий хранится в базе данных:

  • Если событие должно вызвать что-то в веб-интерфейсе, в обновлениях проверьте таблицу для записей, которые "произошли", и добавьте соответствующие визуальные индикаторы/экраны/всплывающие окна к следующему выводу веб-запроса.
  • Если ваши события связаны с фоновой обработкой, самым простым решением является написать отдельное приложение .NET.NET, которое проверяет таблицу событий базы данных для новых записей и проверяет часы, чтобы узнать, какие события произошли. Вы можете проявлять интерес и включать потоковую обработку, если некоторые из событий вызывают длительные процессы и т.д., Но это будет основной дизайн. (Используйте только threading, если вам нужно... простое однопоточное приложение, которое опросит таблицу, будет наиболее надежным)
0
источник

Тогда я предполагаю, что я добавлю какое-то событие/работу где-нибудь, в котором будет содержаться первичный ключ таблицы базы данных. когда событие должно быть запущено, я захвачу эту информацию из db, а затем сделаю логику.

Я не знаю, что такое общее решение, но, изобретая колесо, я бы подумал о создании кластерного индекса базы данных по времени события, поэтому я мог бы каждую минуту проверять базу данных с помощью выражения, такого как...

SELECT * FROM Events WHERE Events.Time < next_minute
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос