c# - 如何使用 Quartz.Net 暂停/恢复作业

标签 c# asp.net scheduled-tasks quartz-scheduler quartz.net

我的项目中有 8 个作业。它们从 Application_Start 事件开始并永远重复。其中两个使用相同的类。每 7 秒完成一项工作,每 30 秒完成一项工作。但是他们在1点上使用了相同的方法。从 xml 文件中读取日期。

如果日期早于当前日期,它会更改 session ID 并向其添加 20 分钟。 session ID 不断变化,因为两者都试图同时进入和处理。 以下是我的需求:

1 - 输入方法。 2 - 如果要更改 session ,请停止当前任务以外的任务。 3 - 更改 session 并保存到 xml。 4 - 重新启动或恢复我所有的被动任务。

private DateTimeOffset g_canlimacgetir = DateTimeOffset.UtcNow.AddSeconds(0);
private DateTimeOffset g_canliorangetir = DateTimeOffset.UtcNow.AddSeconds(45);
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(7).RepeatForever()).StartAt(g_canliorangetir).Build();
        scheduler.ScheduleJob(jobdetay, trigger);
        scheduler.Start();
    }
}
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(30).RepeatForever()).StartAt(g_canlimacgetir).Build();
        scheduler.ScheduleJob(jobdetay, trigger);
        scheduler.Start();
    }
}

private Headers GetTheToken()
    {
        Headers h = new Headers();
        HttpWebResponse response = null;
        try
        {
            const string session_site = "";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(session_site);
            Uri uri = new Uri("");

            request.Method = "GET";
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.ContentType = "text/html; charset=utf-8";
            request.ContentLength = 0;
            Cookie trackerID = new Cookie("trackerId", ConfigurationManager.AppSettings["TrackerID"].ToString()) { Domain = uri.Host };
            DateTime tarih = DateTime.Now;
            request.Timeout = 5000;
            ServicePointManager.Expect100Continue = false;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback = new
            RemoteCertificateValidationCallback(delegate { return true; });
            response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            response.Close();
            response.Dispose();
            reader.Close();
            reader.Dispose();
            DateTime sesstimeout = DateTime.Now.AddSeconds(1199);
            string getCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
            char[] ayiricilar = { '=', ',', ';' };
            string[] parcalar = getCookieHeader.Split(ayiricilar);
            int ses = 0, rv = 0, xt = 0, xct = 0;
            if (parcalar.Length > 20)
            {
                h.session_timeout = sesstimeout;
                for (int i = 0; i < parcalar.Length; i++)
                {
                    if (parcalar[i] == "ASP.NET_SessionId") { h.sessionID = parcalar[i + 1]; ses = 1; }
                    else if (parcalar[i] == "__RequestVerificationToken") { h.request_verification = parcalar[i + 1]; rv = 1; }
                    else if (parcalar[i] == "XSRF-TOKEN") { h.xsrf_token = parcalar[i + 1]; xt = 1; }
                    else if (parcalar[i] == "XSRF-COOKIE-TOKEN") { h.xsrf_cookie_token = parcalar[i + 1]; xct = 1; }
                    if (ses == 1 && rv == 1 && xt == 1 && xct == 1) i = parcalar.Length;
                }
            }
            response.Close();
            response.Dispose();

            XmlDocument doc = new XmlDocument();
            XmlReader xmlReader = new XmlTextReader(HostingEnvironment.MapPath("~/xml/values.xml"));
            doc.Load(xmlReader);
            xmlReader.Close();
            XmlNodeList InfoNode = doc.SelectNodes("SessionInfo/Info");
            InfoNode[0].Attributes["SessionExpires"].Value = h.session_timeout.ToString();
            InfoNode[0].Attributes["SessionID"].Value = h.sessionID;
            InfoNode[0].Attributes["XSRF-TOKEN"].Value = h.xsrf_token;
            InfoNode[0].Attributes["XSRF-COOKIE-TOKEN"].Value = h.xsrf_cookie_token;
            InfoNode[0].Attributes["_requestVerification"].Value = h.request_verification.ToString();
            doc.Save(HostingEnvironment.MapPath("~/xml/values.xml"));
        }
        return h;
    }

最佳答案

对于您可以使用的所有工作

scheduler.PauseAll();

scheduler.ResumeAll();

但是如果你想停止并开始一个特定的工作,你可以使用这个:

scheduler.PauseJob(jobdetay.Key);

scheduler.ResumeJob(jobdetay.Key);

关于c# - 如何使用 Quartz.Net 暂停/恢复作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41314199/

相关文章:

c# - 根据条件拆分字符串

c# - 测试 WebApi Controller Url.Link

c# - asp.net 中可调整大小的 ImageButton 或 Button

ASP.NET MVC 3 : Server cannot append header after HTTP headers have been sent

c# - DataGridViewComboBoxColumn 中的选定项始终检索第一个值

C# 获取完整文件路径

java - 服务器重启或崩溃后的计划任务

algorithm - 任务调度最小等待时间算法

java - ScheduledExecutorService 与使用 Thread.sleep() 滚动您自己的 Runnable 之间的区别

c# - 是否可以使用 Bazel 构建 Unity3D 项目?