Хобрук: Ваш путь к мастерству в программировании

Quartz.net не всегда работает

Я использую простой планировщик библиотеки Quartz.net. У меня есть 7 разных триггеров. Последовательность такая.

Первый: каждые 120 минут.
Второй: каждые 12 часов.
Третий: каждые 5 минут.
Четвертый: каждые 3 минуты.
Пятый: каждые 29 секунд.
Шестое: каждые 10 секунд.
Седьмое: каждые 5 секунд.

Это немного сложно, как вы это видите. У меня такая проблема. Первый триггер должен срабатывать каждые два часа. Но после нескольких прогонов он останавливается сам по себе. Это вообще не работает. Остальные работают и с ними все в порядке. Я извиняюсь за мой плохой английский.

    private int bultengetir = 120; // min
    private int baslayanmacsil = 29; //sec
    private int kuponsonuclandir = 5;//5 min
    private int canliorangetir = 10; //sec
    private int canlimacgetir = 7; //sec
    private int canlimacsil = 12;//hour
    private int videoeslestir = 3; //min

    private DateTimeOffset g_bultengetir = DateTimeOffset.UtcNow.AddMinutes(0);//10
    private DateTimeOffset g_baslayanmacsil = DateTimeOffset.UtcNow.AddMinutes(5);//5
    private DateTimeOffset g_canlimacgetir = DateTimeOffset.UtcNow.AddMinutes(10);//10
    private DateTimeOffset g_canliorangetir = DateTimeOffset.UtcNow.AddMinutes(11);//55
    private DateTimeOffset g_canlimacsil = DateTimeOffset.UtcNow.AddMinutes(12);//5
    private DateTimeOffset g_kuponsonuclandir = DateTimeOffset.UtcNow.AddMinutes(15);//15
    private DateTimeOffset g_videoeslestir = DateTimeOffset.UtcNow.AddMinutes(15);//7

    public void RunJobs()
    {
        CanliMaclariGetir();
        CanliOranlariGetir();
        BultenGetir();
        BaslayanMaclariSil();
        CanliMaclariSil();
        KuponlariSonuclandir();
        VideoEslestir();
    }
    private void BultenGetir()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();

            IJobDetail jobdetay = JobBuilder.Create<BultenGetir>()
                .WithIdentity("bultengetir")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInMinutes(bultengetir).RepeatForever())
                .StartAt(g_bultengetir)
                .Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();
            Log log = new Log()
            {
                Name = "BultenGetir Görev Emri",
                Description = "BultenGetir Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "BultenGetir()", DateTime.Now, h_mesaj, icerik, h_yer);
        }

    }
    private void BaslayanMaclariSil()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();

            IJobDetail jobdetay = JobBuilder.Create<BaslayanMaclariSil>()
                .WithIdentity("baslayansil")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInSeconds(baslayanmacsil).RepeatForever())
                .StartAt(g_baslayanmacsil)
                .Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();

            Log log = new Log()
            {
                Name = "BaslayanMaclariSil Görev Emri",
                Description = "BaslayanMaclariSil Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "BaslayanMaclariSil()", DateTime.Now, h_mesaj, icerik, h_yer);
        }
    }
    private void KuponlariSonuclandir()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();

            IJobDetail jobdetay = JobBuilder.Create<KuponlariSonuclandir>()
                .WithIdentity("kuponsonuclandir")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInMinutes(kuponsonuclandir).RepeatForever())
                .StartAt(g_kuponsonuclandir)
                .Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();

            Log log = new Log()
            {
                Name = "KuponlariSonuclandir Görev Emri",
                Description = "KuponlariSonuclandir Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "KuponlariSonuclandir()", DateTime.Now, h_mesaj, icerik, h_yer);
        }
    }
    private void CanliOranlariGetir()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();
            IJobDetail jobdetay = JobBuilder.Create<CanliOranlar>()
                .WithIdentity("canliorangetir")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInSeconds(canliorangetir).RepeatForever()).StartAt(g_canliorangetir).Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();

            Log log = new Log()
            {
                Name = "CanliOranlariGetir Görev Emri",
                Description = "CanliOranlariGetir Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "CanliOranlariGetir()", DateTime.Now, h_mesaj, icerik, h_yer);
        }
    }
    private void CanliMaclariGetir()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();
            IJobDetail jobdetay = JobBuilder.Create<CanliMaclar>()
                .WithIdentity("canlimacgetir")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInSeconds(canlimacgetir).RepeatForever()).StartAt(g_canlimacgetir).Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();
            Log log = new Log()
            {
                Name = "CanliMaclariGetir Görev Emri",
                Description = "CanliMaclariGetir Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "CanliMaclariGetir()", DateTime.Now, h_mesaj, icerik, h_yer);
        }
    }
    private void CanliMaclariSil()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();

            IJobDetail jobdetay = JobBuilder.Create<CanliSil>()
                .WithIdentity("canlimacsil")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInHours(canlimacsil).RepeatForever())
                .StartAt(g_canlimacsil)
                .Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();

            Log log = new Log()
            {
                Name = "CanliMaclariSil Görev Emri",
                Description = "CanliMaclariSil Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "CanliMaclariSil()", DateTime.Now, h_mesaj, icerik, h_yer);
        }
    }
    private void VideoEslestir()
    {
        try
        {
            ISchedulerFactory schfack = new StdSchedulerFactory();
            IScheduler scheduler = schfack.GetScheduler();

            IJobDetail jobdetay = JobBuilder.Create<VideoEslestir>()
                .WithIdentity("videoeslestir")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInMinutes(videoeslestir).RepeatForever())
                .StartAt(g_videoeslestir)
                .Build();
            scheduler.ScheduleJob(jobdetay, trigger);
            scheduler.Start();

            Log log = new Log()
            {
                Name = "VideoEslestir Görev Emri",
                Description = "VideoEslestir Görev Emri Verildi.",
                Start = DateTime.Now,
                Finish = DateTime.Now,
                TotalMilliSecond = 0,
                Type = 6
            };
            DbWork db = new DbWork();
            db.LogEkle(log);
        }
        catch (Exception ex)
        {
            string h_mesaj = ex.Message.ToString();
            string icerik = "";
            if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
            string h_yer = ex.StackTrace.ToString();
            dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "videoeslestir()", DateTime.Now, h_mesaj, icerik, h_yer);
        }
    }

  • Опубликуйте выражения CRON, которые вы используете 06.03.2017
  • Quartz.net работает в пуле приложений веб-сайта. Если трафика нет, AppPool будет переведен в спящий режим и триггеры не сработают. Когда пул снова запускается, таймер сбрасывается. Или что-то еще вызывает перезапуск AppPool, например, изменения в папке bin 06.03.2017
  • Хорошо, я добавляю исходный код. 06.03.2017
  • VDWWD спасибо за интерес. Я предупреждаю вас, отправляя свой собственный сервер HttpWebRequest. На данный момент ApplicationPool всегда работает. Это не останавливается. 06.03.2017
  • @GökhanAtilgan Вам действительно нужно 7 разных планировщиков для вашей работы? Обычно вы создаете только один и планируете все свои задания там. Кстати. Quartz проглатывает все исключения, возникающие во время выполнения. Вы уверены, что исключений не возникает? 06.03.2017
  • @Rabban На самом деле было 10 расписаний. Но я сгруппировал те, которые начнутся в один и тот же момент. При ошибках запустите и забудьте сказать Task.Factory.StartNew(() => LegendsGetir()); Я использую команду каждый триггер. 06.03.2017
  • @GökhanAtilgan Но зачем так много планировщиков? Вам нужен только один. Каждый планировщик поставляется с TreadPool из 10 потоков. Возможно, эти пулы потоков блокируют друг друга из-за того, что больше нет потоков для выполнения ваших заданий. 06.03.2017
  • @Rabban Каждый планировщик должен работать через определенные промежутки времени. Например, список матчей в прямом эфире нужно получить с другого сервера за 5 секунд. Точно так же пропорции живых матчей нужно рисовать за 10 секунд. Обычные, неживые матчи и шансы должны быть разыграны в течение 2 часов. Также нужно каждые 5 минут подбирать результаты матча и дорабатывать букмекерские купоны. 06.03.2017
  • @GökhanAtilgan, кажется, вы неправильно поняли разницу между триггером и планировщиком. Все ваши точки, которые вы указали, контролируются с помощью триггеров, каждый из которых может иметь разный интервал и может запускать разные задания. Но для всего этого вам нужен только один планировщик. Каждый планировщик может запускать 10 различных триггеров по умолчанию (вы можете увеличить это ограничение до пределов вашей машины). Но вам нужен всего лишь один планировщик. 06.03.2017
  • @Rabban Извините, я этого не знал. Как мне это сделать? Не могли бы вы привести пример? 06.03.2017
  • @GökhanAtilgan Нет необходимости извинять Аби;) Просто создайте планировщик в своем методе RunJobs и укажите другие методы в качестве параметра private void BultenGetir(IScheduler scheduler) 06.03.2017
  • @Rabban :) Эйвалла, но я думаю, тебе нужно привести полный пример. Можете ли вы организовать для меня две задачи в исходном коде, который я дал выше? добавляю остальные. 06.03.2017

Ответы:


1

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

Вы можете изменить свой код, чтобы создать только один планировщик

public void RunJobs()
{
    ISchedulerFactory schfack = new StdSchedulerFactory();
    IScheduler scheduler = schfack.GetScheduler();

    CanliMaclariGetir(scheduler);
    // ...your other jobs

    // after scheduling all of your jobs, start the scheduler
    scheduler.Start();
}

private void CanliMaclariGetir(IScheduler scheduler)
{
    try
    {
        IJobDetail jobdetay = JobBuilder.Create<CanliMaclar>()
            .WithIdentity("canlimacgetir")
            .Build();
        ITrigger trigger = TriggerBuilder.Create()
            .WithSimpleSchedule(s => s.WithIntervalInSeconds(canlimacgetir).RepeatForever()).StartAt(g_canlimacgetir).Build();
        scheduler.ScheduleJob(jobdetay, trigger);

        Log log = new Log()
        {
            Name = "CanliMaclariGetir Görev Emri",
            Description = "CanliMaclariGetir Görev Emri Verildi.",
            Start = DateTime.Now,
            Finish = DateTime.Now,
            TotalMilliSecond = 0,
            Type = 6
        };

        DbWork db = new DbWork();
        db.LogEkle(log);
    }
    catch (Exception ex)
    {
        string h_mesaj = ex.Message.ToString();
        string icerik = "";
        if (ex.InnerException != null) { icerik = ex.InnerException.ToString(); }
        string h_yer = ex.StackTrace.ToString();
        dal.HataEkle("", "Gorevler Katmanı > Gorev_Zamanlayici.cs", "CanliMaclariGetir()", DateTime.Now, h_mesaj, icerik, h_yer);
    }
}

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

public ITrigger CreateTrigger(TimeSpan timeSpan, string name = "")
{
    return TriggerBuilder.Create()
        .StartNow()
        .WithDescription(name)
        .WithSimpleSchedule(x => x
            .WithInterval(timeSpan)
            .RepeatForever())
        .Build();
}

Остальное для оптимизации кода зависит от вас;)

06.03.2017
Новые материалы

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..