Правильный способ ежедневного планирования задачи в веб-приложении на C # .NET

c# asp.net web scheduled-tasks

5510 просмотра

2 ответа

872 Репутация автора

У меня есть приложение ASP.NET MVC, которое позволяет пользователям хранить такие медиа, как видео и фотографии.

Приложение также позволяет пользователям удалять носители, хранящиеся на сервере. Для этого я хочу реализовать процесс «двух шагов», при котором сначала (когда носитель выбран для удаления), запись носителя в базе данных получит метку времени, которая указывает, что запись должна быть удалена через некоторое время ( месяц например); если эта временная метка не удаляется в это время, должен существовать запланированный метод, который выполняется ежедневно и проверяет, имеет ли запись мультимедиа достаточно старую временную метку, чтобы ее можно было удалить.

Мой вопрос о планировщике: я читал, что есть некоторые фреймворки, такие как FluentScheduler или Quartz.NET для реализации такого рода заданий. Поскольку приложение представляет собой веб-приложение, развернутое в IIS, я боюсь не использовать правильный способ, структуру или метод для его реализации. Поскольку IIS может закрыть мое приложение в любое время и поскольку запланированный метод будет выполнять записи в БД и в файловую систему IO для удаления записей БД и физических файлов, для меня жизненно важно, чтобы метод выполнялся полностью или не выполнялся при все, чтобы БД соответствовала файлам, хранящимся на hd.

Моя первая ставка на FluentScheduler, но мне нужно знать, является ли использование подобных фреймворков лучшим решением.

Я знаю, что такие вопросы не приветствуются в StackOverflow. Это не вопрос мнения, я просто хочу прочитать решения и выбрать то, которое наилучшим образом соответствует моим требованиям.

Вот некоторый псевдокод того, что будет внутри запланированного метода:

using(ViewMediaDBUnitOfWork uw = new ViewMediaDBUnitOfWork())
        {
            var today = DateTime.Now.Date;

            List<Media> mediaToDelete = uw.MediaRepository.Get(m => (m.ToDelete - today).value.Days > 30);
            mediaToDelete.ForEach(m =>
            {
                try
                {
                    //Deletes from DB
                    uw.MediaRepository.Delete(m);
                    //Deletes the file
                    File.Delete(m.Path);
                    //If everything is ok, savechanges
                    uw.MediaRepository.SaveChanges();
                }
                catch(Exception e)
                {
                    LogManager.GetCurrentClassLogger().Error("Error deleting. " + m.Path, e);
                }                    
            });
        }
Автор: MorgoZ Источник Размещён: 18.07.2016 03:04

Ответы (2)


2 плюса

4161 Репутация автора

Решение

Если вы собираетесь планировать задачу, по крайней мере вы захотите сделать это в контексте HostingEnvironment.QueueBackgroundWorkItem . Это зарегистрирует вашу работу во время выполнения ASP.NET. Хотя есть предостережения. Когда ASP.NET перезагружается по какой-либо причине, он уведомляет о фоновой работе (путем установки CancellationToken) и затем ожидает до определенного периода времени (я думаю, 30 секунд), чтобы работа завершилась. Если фоновая работа не будет завершена в этот период времени, работа исчезнет.

FluentScheduler и Quartz - хорошие фреймворки, но вам следует избегать планирования работы в контексте вашего приложения ASP.NET, если вы можете избежать этого (по причинам, указанным выше). Вы можете создать службу, которая использует эти платформы для планирования заданий / повторяющихся задач за пределами вашего приложения.

Однако более надежным выбором является использование технологии / инфраструктуры, такой как Hangfire, которая работает в сочетании с неким надежным хранилищем, таким как SQL Server, Redis или MSMQ.

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

Автор: William Xifaras Размещён: 18.07.2016 03:59

0 плюса

107 Репутация автора

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

Как одно из очень быстрых решений, создание скрипта Powershell , запускающего SQL-запрос, занимает около 10 минут , удаляя данные, где TimeStamp> x date.

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

Есть также несколько других способов, таких как SSIS, но это может быть более сложным, чем вам нужно.

Автор: Nick Размещён: 06.04.2017 10:42
Вопросы из категории :
32x32