Quartz.net并非总能正常工作 [英] Quartz.net does not always work

查看:108
本文介绍了Quartz.net并非总能正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Quartz.net库的简单调度程序. 我有7个不同的触发器.顺序是这样的.

I am using the simple scheduler of the Quartz.net library. I have 7 different triggers. The sequence is like this.

首先:每120分钟一次.
第二:每12个小时.
第三:每5分钟一次.
第四次:每3分钟一次.
第五:每29秒.
第六:每10秒.
第七:每5秒一次.

First: every 120 minutes.
Second: every 12 hours.
Third: every 5 minutes.
Fourth: every 3 minutes.
Fifth: every 29 seconds.
Sixth: every 10 seconds.
Seventh: every 5 seconds.

您看到的有点复杂.我有这样的问题. First Trigger需要每两个小时工作一次.但是经过几次运行,它会自行停止.它根本不起作用.其他人都在工作,他们还可以. 对不起,我的英语不好.

It's a bit complicated as you see it. I have a problem like this. First Trigger needs to work every two hours. But after a few runs, it stops by itself. It does not work at all. The others are working and they are OK. I'm sorry for my bad english.

    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);
        }
    }

推荐答案

正如我在我的评论中提到的,您当前使用的调度程序与触发器一样多.每个调度程序将使用其自己的带有10个线程的线程池,并且由于没有更多的线程来执行作业,您的线程可能会彼此阻塞.您所有的触发器只需要一个Scheduler.

As i mentioned in my comments, you use currently as many schedulers as triggers you have. Each scheduler will use his own Threadpool with 10 threads and it could be possible that your Threads gets blocked by each other due to the fact that there are no more Threads to execute your jobs. You need only 1 Scheduler for all your Triggers.

您可以更改代码以仅创建一个Scheduler

You can change your code to create just one Scheduler

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);
    }
}

我还建议您重新编写整个代码,以免重复.您的方法几乎相同.您可以使用一种方法来创建触发器以使其更具可读性:

I would also recommend that you rework the whole code to not repeat yourself. Your methods do almost the same. You can use a method to create your Trigger to make it more readable:

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

其余优化代码的工作由您决定;)

The rest to optimize the code is up to you ;)

这篇关于Quartz.net并非总能正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆