1

我正在开发一个 asp.net mvc 5 Web 应用程序,部署在 IIS-8 中,我的应用程序中有一个方法可以执行一项长时间运行的任务,主要扫描我们的网络以查找服务器和虚拟机,并使用扫描结果更新我们的数据库. 方法执行可能会持续 30-40 分钟才能在生产环境中完成。我正在使用一个名为 Hangfire 的计划工具,它每天会调用此方法 2 次。

这是 startup.cs 文件中的作业定义,它将在8:01 am&处调用方法8:01 pm:-

public void Configuration(IAppBuilder app)
{
    var options = new SqlServerStorageOptions
    {
        PrepareSchemaIfNecessary = false
    };
    GlobalConfiguration.Configuration.UseSqlServerStorage("scanservice",options);

    RecurringJob.AddOrUpdate(() => ss.Scan(), "01 8,20 ***");
}

这是计划工具每天调用两次的方法:-

public void Scan()
{
    Service ss = new Service();
    ss.NetworkScan().Wait();
}

最后,进行真正扫描的方法是(我只提供该方法将做什么的高级描述):-

public async Task<ScanResult> NetworkScan()
{
    // retrieve the server info from the DB
    // loop over all servers & then execute some power shell commands to scan the network & retrieve the info for each server one by one...
    // after the shell command completed for each server, i will update the related server info inside the DB 

目前我在我们的测试环境上做了一些测试,一切都运行良好,扫描大约需要 25 秒来扫描 2 个测试服务器。但是现在我们计划将应用程序转移到生产环境中,我们有大约 120++ 个服务器要扫描. 所以我估计方法执行需要大约 30 -40 分钟才能在生产环境中完成。所以我的问题是如何确保此执行永不过期,并且 ScanNetwork() 方法将完成到最后?

4

1 回答 1

2

也许您可以为每个服务器启动一个新任务,而不用担心您的任务超时。这样,每个任务的生命周期都会很短,并且任何由扫描单个服务器引起的异常都不会影响所有其他任务。此外,如果您的应用程序在 IIS 中重新启动,任何尚未完成的扫描都将恢复。由于所有扫描都发生在一个顺序任务中,这是不可能的。您可能还会看到完成整个网络扫描的总时间直线下降,因为大部分时间可能会花在等待远程服务器上。

public void Scan()
{
    Service ss = new Service();
    foreach (var server in ss.GetServers())
    {
        BackgroundJob.Enqueue<Service>(s => s.ServerScan(server));
    }
}

现在,您的计划任务将简单地为每个服务器排队一个新任务。

于 2015-10-07T20:10:51.190 回答