【问题标题】:Scheduling a Task in VB ASP.NET MVC在 VB ASP.NET MVC 中调度任务
【发布时间】:2012-08-29 03:25:47
【问题描述】:

我正在阅读使用 Quartz http://quartznet.sourceforge.net/tutorial/lesson_3.html 但我不明白如何实现。我也在阅读这个https://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

【问题讨论】:

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


    【解决方案1】:

    我通常认为让 Web 服务器进行自动化是不好的做法,我更喜欢将其保留在更适合自动化工作的服务中。

    也就是说,使用上面的文章,我会将标题为 using 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 类中获取。

    【讨论】:

    • 感谢您的回答。我有更好的理解;但我不知道要在“标题为使用 Quartz.net 的部分放入 global.asax 中的 application_start”中什么。另外,如何关闭 application_end 中的作业调度程序?
    • 这是一个快速示例,它每小时运行一次触发器,您需要更改它以匹配您想要的内容
    • 谢谢,Slicksim。这很有帮助。
    • 我试图使用您的代码,但收到错误消息。我打开了一个新问题stackoverflow.com/questions/12303637/… 也许你可以帮忙,因为这是你的代码。
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多