Asp.net mvc 如何在asp.net mvc中使用quartz.net停止当前作业并启动新作业?

Asp.net mvc 如何在asp.net mvc中使用quartz.net停止当前作业并启动新作业?,asp.net-mvc,quartz.net,Asp.net Mvc,Quartz.net,我在一个网站上制作了一个爬虫程序,它必须阅读一个网站并从它的网站上获取一些值。我使用了quartz.net和Asp.net MVC。但我的问题是什么?事实上,我的问题是,例如,他/她第一次开始清理“Stackoverflow.com”大约5个小时,然后他/她决定停止“Stackoverflow.com”,并创建一个新的网站。那么,我该怎么做呢 [HttpPost] 公共操作结果索引(字符串关键字、字符串url) { isScheduler scheduler=StdSchedulerFacto

我在一个网站上制作了一个爬虫程序,它必须阅读一个网站并从它的网站上获取一些值。我使用了quartz.net和Asp.net MVC。但我的问题是什么?事实上,我的问题是,例如,他/她第一次开始清理
“Stackoverflow.com”
大约5个小时,然后他/她决定停止
“Stackoverflow.com”
,并创建一个新的网站。那么,我该怎么做呢

[HttpPost]
公共操作结果索引(字符串关键字、字符串url)
{
isScheduler scheduler=StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail job=JobBuilder.Create()
.WithIdentity(“我的工作”)
.使用作业数据(“url”,url)
.使用作业数据(“关键字”,关键字)
.Build();
ITrigger trigger=TriggerBuilder.Create()。带DailyTimeIntervalsSchedule(
s=>s.WithIntervalInSeconds(20).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0,0))
).Build();
ScheduleJob(作业,触发器);
返回视图(db.Scraps.ToList());
}

公共列表抓取(字符串url、字符串关键字)
{
整数计数=0;
列表报废=新列表();
报废作业报废=空;
HtmlDocument doc=新的HtmlDocument();
尝试
{
var request=(HttpWebRequest)WebRequest.Create(url);
request.Method=“GET”;
使用(var response=(HttpWebResponse)request.GetResponse())
{
使用(var stream=response.GetResponseStream())
{
文档加载(流、编码、GetEncoding(“UTF-8”);
foreach(doc.DocumentNode.SelectNodes(“//text()”)中的HtmlNode节点)
{
if(node.InnerText.ToString()包含(关键字))
{
计数++;
scrap=newscrapjob{Keyword=Keyword,DateTime=System.DateTime.Now.ToString(),Count=Count,Url=Url};
}
}
}
}
}
捕获(WebException ex)
{
控制台写入线(例如消息);
}
//废料。添加(废料);
var isExist=db.Scraps.Where(s=>s.Keyword==Keyword&&s.Count==Scraps.Count)。Max(s=>(int?)s.Id)??0;
如果(isExist==0)
{
db.废料。添加(废料);
db.SaveChanges();
}
回收废料;
}
public void Execute(IJobExecutionContext上下文)
{
//报废作业报废=空;
使用(var scrap=new ScrapJob())
{
JobKey key=context.jobdail.key;
JobDataMap dataMap=context.jobdail.JobDataMap;
字符串url=dataMap.GetString(“url”);
字符串关键字=dataMap.GetString(“关键字”);
报废.报废(url,关键字);
}
}

我不知道你为什么选择石英,但我认为这里有一些东西可以帮助你

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

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);
}
但我相信你需要定义你期望的行为,因为它可能更复杂,例如:

  • 如果您想暂停作业,在完成其他网站/保持某些状态和进度/或只记录进度后继续作业
  • 如果您希望它们并行运行并同时处理多个站点。(您只需要给出不同的名称,而不是硬编码的.WithIdentity(“MyScrapJob”))
  • 同样,通过scheduler.GetCurrentlyExecutingJobs(),您可以获取当前正在执行的作业,将它们显示给用户,并让用户决定要做什么 同时看看你的动作方法,我不确定这是否是你期望的触发行为。此外,困扰我的是DB。Trime.Trist.()你将实现整个表,你可以考虑添加分页,在你的情况下也不是必要的,因为你只会显示计数,但是如果你在网格中有很多记录,它是强制的。 关于刮削法 而不是

    var isExist = db.Scraps.Where(s => s.Keyword == keyword && s.Count == scrap.Count).Max(s => (int?)s.Id) ?? 0;
    
    你可以用。任何

    var exists = db.Scraps.Any(s => s.Keyword == keyword && s.Count == scrap.Count);
    
    这将返回布尔值,您可以检查(!是否存在)

    您可以查看它的高性能web解析库。超级容易使用以及

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


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

    我想删除作业Quartz时出错。无法中断作业异常:无法中断,因为它没有实现Quartz.IIInterruptableJob'
    var isExist = db.Scraps.Where(s => s.Keyword == keyword && s.Count == scrap.Count).Max(s => (int?)s.Id) ?? 0;
    
    var exists = db.Scraps.Any(s => s.Keyword == keyword && s.Count == scrap.Count);