在VB ASP.NET MVC中调度任务

时间:2012-09-04 12:58:45

标签: asp.net-mvc vb.net asp.net-mvc-3 scheduled-tasks quartz-scheduler

我正在阅读使用Quartz http://quartznet.sourceforge.net/tutorial/lesson_3.html,但我不明白如何实现。我也在读这个http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/,也不明白如何实现,具体来说,我在哪里放置它以及如何访问我的控制器/动作?

上面链接的文章有一条评论建议使用“...... global.asax中的一个简单计时器”。如何实现这一目标?

基本上,我想知道如何(以及最好的方法)在以下控制器上安排以下操作?

Public Class RssController
    Inherits System.Web.Mvc.Controller

    Function InsertRssFeedItem(ByVal url as String) As ActionResult

      ' code to get RSS and insert into database '

    End Function

End Class

1 个答案:

答案 0 :(得分:1)

我一般认为让Web服务器进行自动化是不好的做法,我更喜欢将其放在更适合自动化作业的服务中。

那就是说,使用上面的技巧,我会把标题为Quartz.net的部分放入global.asax中的application_start

在application_end中,关闭作业调度程序。

最后,在一个文件夹中,写一个类,如:

<强> c#中

public class InsertRssFeedJob : IJob
{
     public void Execute(JobExecutionContext context)
     {
          var rssController = new RssController();
          rssController.InsertRssFeedItem("");
     }
}

<强> vb.net

Public Class InsertRssFeedJob
    Implements IJob

    Public Sub Execute(context as JobExecutionContext)
        Dim rssContoller = new RssController()
        rssController.InsertRssFeedItem("")
    End Sub

End Class

抱歉,我不熟悉VB在IDE之外编写它,所以你需要转换这个c#。

 private static IScheduler _scheduler; 
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        _scheduler = new StdSchedulerFactory().GetScheduler();

        JobDetail jobDetail = new JobDetail("rssFeedJob", null, typeof(InsertRssFeedJob));
        // fire every hour
        Trigger trigger = TriggerUtils.MakeHourlyTrigger();
        // start on the next even hour
        trigger.StartTime = TriggerUtils.GetEvenHourDate(DateTime.UtcNow);
        trigger.Name = "myTrigger";

        _scheduler.ScheduleJob(jobDetail, trigger); 

    }

    protected void Application_End()
    {
        _scheduler.Shutdown();
    }

此外,如果RssController需要访问任何上下文信息,您需要从HttpContext类中获取它。

的Si