代码之家  ›  专栏  ›  技术社区  ›  Daniel Peñalba

为ASP.NET MVC实现作业调度程序

  •  1
  • Daniel Peñalba  · 技术社区  · 14 年前

    我需要执行一些 活动/工作 在我的Web服务器中,比如索引一些信息,组织一些文件,计算一些统计数据……

    我想在我的Web服务器中保留QoS(性能、内存消耗…)。所以我在想 执行外部进程 对于这些活动,而不是调用线程。类似于 Apache MPM processer (它启动子进程来处理请求)。

    • 你知道最好的解决办法吗?
    • 你知道有图书馆能帮我吗?

    提前谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Darin Dimitrov    14 年前

    你可以看看 Quartz.NET 它允许您计划将在服务器上运行的作业。

        2
  •  1
  •   Piers Karsenbarg    14 年前

    你能做些像在堆栈交换站点上那样的事情吗?

    http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

        3
  •  1
  •   Daniel Peñalba    14 年前

    嗯,我最终实现了一个在外部流程中执行任务/作业的系统。

    如果有人想知道我是如何实现的,这里有一些细节。也许我会写一篇文章来分享解决方案和源代码。

    基本上,我们有两个部分 Web.dll (ASP.NET应用程序)和一个名为 TaskExecutor.exe

    Web.dll ,有一个活动计划程序可以按名称注册任务:例如:

    ActivityScheduler.Get().RegisterActivity("GenerateSearchIndexes", 4 * 1000 * 60 * 60); //each 2 hours
    

    活动调度器执行线程中的每个活动,该线程调用外部进程 ActivityExecutor.exe

    此程序集引用了 Web.dll 它有一个静态活动工厂来获取活动。外部进程的源代码非常简单:

    public static void Main (string[] args)
    {
        try
        {
            if (args.Length == 0)
            {
                throw new ArgumentException("No activity name given", "ActivityName");
            }
            //parameter 0 is the activity name
            string activityName = args[0];
            IScheduledActivity activity = ActivityFactory.GetActivity(activityName);
    
            if (activityName != null)
            {
                activity.Execute(args);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error executing activity: " + ex.Message);
        }
    }
    

    正如您可以猜到的,这里的限制是活动必须静态定义,因此它们不能在其构造函数中接收参数。通过了 IScheduledActivity.Schedule(string[] args) 方法,就像程序一样。