Кварцевый планировщик в моем приложении ASP.NET MVC выполняет задание только после обновления веб-страницы / приложения на сервере IIS - PullRequest
0 голосов
/ 24 января 2019

Итак, я использую Quartz Scheduler для своего приложения ASP.NET MVC, чтобы запланировать работу для записи файла.Это задание может запускаться ежечасно, ежедневно, еженедельно и т. Д. В зависимости от требований пользователя при настройке задания с веб-страницы.

Код по этой ссылке: Как проверить, выполняется ли конкретное задание в кварцевом планировщике c #

Однако я отказался от метода stop (), чтобы запустить настроенное заданиенавсегда.Я могу успешно запустить задания локально, но вижу, что задание файла выполняется только после обновления веб-приложения, работающего на сервере IIS.

Сначала я вызывал start () моего планировщика заданий в Application_start () файла Global.asax.cs, чтобы возобновить задание при запуске веб-приложения.

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        using (var db = new M3DBContext())
        {
            //db.Configurations is a table in my db
            var file_loc = (from c in db.Configurations where c.ConfigurationKey == "file_location" select c.ConfigurationValue).Single();
            var freq = (from c in db.Configurations where c.ConfigurationKey == "frequency" select c.ConfigurationValue).Single();
            var delim = (from c in db.Configurations where c.ConfigurationKey == "delimiter" select c.ConfigurationValue).Single();
            var datetime = (from c in db.Configurations where c.ConfigurationKey == "datetime" select c.ConfigurationValue).Single();

            //System.Diagnostics.Debug.WriteLine(file_loc + " " + freq + " " + delim + " " + datetime);
            JobScheduler js = new JobScheduler(datetime,freq);
            if (!(file_loc.Equals("default") || freq.Equals("default") || delim.Equals("default") || datetime.Equals("1970-1-1")))
            {
                js.start();
            }
        }
    }

Но главное требование состоит в том, чтобы запланированное задание выполнялось вечно с заданными интервалами, несмотря на то, что веб-приложение открыто / закрыто / обновлено / не обновлено.Моя работа не запускается, когда веб-приложение закрыто и IIS все еще включен.

Как я могу заставить планировщик кварца моего приложения работать вечно в IIS, несмотря на то, что веб-приложение открыто / закрыто / обновлено / не обновлено

Ответы [ 2 ]

0 голосов
/ 24 января 2019

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

Сказав это, если у вас по какой-то причине есть , чтобы иметь это как часть вашего веб-приложения, тогда вам нужно будет включить функцию, чтобы приложение всегда работало.Как упомянуто выше, вы захотите включить предварительную загрузку и всегда включать режим IIS https://blogs.msdn.microsoft.com/vijaysk/2012/10/09/iis-8-whats-new-application-pool-settings/

. Единственная альтернатива этому - иметь внешний сервис для доступа к странице (любой странице) приложения на регулярной основе.основе или при запуске сервера.Это можно выполнить как запланированное задание / задание cron с помощью простой команды curl для загрузки страницы.

0 голосов
/ 24 января 2019

Application_Start запускается только после первого HTTP-запроса и, действительно, после перезапуска IIS, JobScheduler не будет запускаться, пока новый запрос не вызовет веб-сервер.Вы не можете изменить это поведение.

Однако вы можете заставить IIS запускать запрос по умолчанию после перезапуска, включив preloadEnabled в настройках IIS вашего веб-сайта.Это вызовет Application_Start.

...