【问题标题】:How to stop current job and start new job use quartz.net in asp.net mvc?如何在asp.net mvc中停止当前工作并开始新工作使用quartz.net?
【发布时间】:2018-01-21 13:31:58
【问题描述】:

我在一个网站上做了一个爬虫,它必须读取一个网站并从它的网站上获取一些值。我已经使用了quartz.net 和 Asp.net MVC。但我的问题是什么?事实上,我的问题是,例如,他/她第一次开始抓取"Stackoverflow.com" 大约 5 小时,然后他/她决定停止 "stackoverflow.com" 并开始一个废弃的新网站。所以,我该怎么做是吗?

   [HttpPost]
    public ActionResult Index(string keyword, string url)
    {
        IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

        scheduler.Start();
        IJobDetail job = JobBuilder.Create<ScrapJob>()
            .WithIdentity("MyScrapJob")
            .UsingJobData("url", url)
            .UsingJobData("keyword", keyword)
            .Build();

        ITrigger trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule(
            s => s.WithIntervalInSeconds(20).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
            ).Build();
        scheduler.ScheduleJob(job, trigger);

        return View(db.Scraps.ToList());
    }

 public List<ScrapJob> Scraping(string url, string keyword)
    {
        int count = 0;
        List<ScrapJob> scraps = new List<ScrapJob>();
        ScrapJob scrap = null;
        HtmlDocument doc = new HtmlDocument();
        try
        {
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";

            using (var response = (HttpWebResponse)request.GetResponse())
            {

                using (var stream = response.GetResponseStream())
                {
                    doc.Load(stream, Encoding.GetEncoding("UTF-8"));
                    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()"))
                    {
                        if (node.InnerText.ToString().Contains(keyword))
                        {
                            count++;
                            scrap = new ScrapJob { Keyword = keyword, DateTime = System.DateTime.Now.ToString(), Count = count, Url = url };
                        }

                    }

                }
            }
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Message);
        }
        //  scraps.Add(scrap);
        var isExist = db.Scraps.Where(s => s.Keyword == keyword && s.Count == scrap.Count).Max(s => (int?)s.Id) ?? 0;
        if (isExist == 0)
        {
            db.Scraps.Add(scrap);
            db.SaveChanges();
        }



        return scraps;
    }

    public void Execute(IJobExecutionContext context)
    {
        //ScrapJob scraps = null;
        using (var scrap = new ScrapJob())
        {
            JobKey key = context.JobDetail.Key;
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string url = dataMap.GetString("url");
            string keyword = dataMap.GetString("keyword");
            scrap.Scraping(url, keyword);
        }
    }

【问题讨论】:

    标签: asp.net-mvc quartz.net


    【解决方案1】:

    我不确定您为什么选择 QUARTZ,但我认为这里有一些对您有帮助的东西。

    这是一个通过唯一标识符中断和删除作业的代码示例

    public void DeleteJob(JobKey jobKey)
    {
        var scheduler = StdSchedulerFactory.GetDefaultScheduler();
    
        var executingJobs = scheduler.GetCurrentlyExecutingJobs();
    
        if (executingJobs.Any(x => x.JobDetail.Key.Equals(jobKey)))
        {
            scheduler.Interrupt(jobKey);
        }
    
        scheduler.DeleteJob(jobKey);
    }
    

    但我相信您需要定义您期望的行为,因为它可能会更复杂一些,例如:

    1. 如果您想暂停工作并在完成其他网站后恢复工作/坚持一些状态和进度/或只记录进度
    2. 如果您希望它们并行运行并同时处理多个站点。 (您只需要提供不同的名称,而不是硬编码的 .WithIdentity("MyScrapJob") )
    3. 还可以使用 scheduler.GetCurrentlyExecutingJobs() 获取当前正在执行的作业,将它们显示给用户并让他决定做什么。

    同时查看您的操作方法,我不确定这是否是您期望该触发器的行为。另外困扰我的是 db.Scraps.ToList() 您将实现整个表格 您可以考虑在您的情况下添加分页也不是必需的,因为您只会显示计数,但如果您在网格中有很多记录,则它是强制性的.

    关于刮法 而不是

    var isExist = db.Scraps.Where(s => s.Keyword == keyword && s.Count == scrap.Count).Max(s => (int?)s.Id) ?? 0;
    

    你可以使用 .Any

    var exists = db.Scraps.Any(s => s.Keyword == keyword && s.Count == scrap.Count);
    

    这将返回布尔值,您可以检查 if(!exists)

    您可以查看https://github.com/AngleSharp/AngleSharp 它的高性能网络解析库。超级好用。

    如果您通过关键字和计数检查它们,我看到关键字重复记录的可能性 - 不确定您是想要这个还是只是想用它的计数器更新现有记录

    祝你好运!我希望这个答案对你有帮助:)

    【讨论】:

    • 我想删除作业时出现这个错误 Quartz.UnableToInterruptJobException: can not be interrupted, since it doesn't implement Quartz.IInterruptableJob'
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2020-11-21
    • 1970-01-01
    • 2017-07-31
    • 2012-05-09
    • 2013-01-02
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多