控制台/ Web App解决方案上的Hangfire作业?

时间:2015-12-23 17:50:36

标签: asp.net-mvc scheduled-tasks hangfire

我是Hangfire的新手,我正在努力了解它是如何工作的。

所以我在同一个解决方案中有一个MVC 5应用程序和一个Console应用程序。控制台应用程序是一个简单的应用程序,只更新数据库上的一些数据(最初计划使用Windows任务计划程序)。

我在哪里安装Hangfire?在Web应用程序或控制台中?或者我应该将控制台转换为Web应用程序中的类吗?

2 个答案:

答案 0 :(得分:5)

如果我理解正确,你的解决方案中的控制台就像"伪" HangFire,因为就像你说它会超时完成一些数据库操作而你计划使用任务调度程序执行它。

HangFire概述

HangFire的设计可以完全按照您的控制台应用程序执行,但具有更多功能和功能,因此您可以避免自行创建所有内容的所有开销。

HangFire Instalation

HangFire通常与ASP.NET应用程序一起安装,但如果您仔细阅读文档,您会惊奇地发现:

  

Hangfire项目包含几个可用的NuGet包   NuGet Gallery网站。以下是您应该了解的基本软件包列表   约:

     
      
  • Hangfire - 仅用于安装的bootstrapper软件包   对于使用SQL Server作为作业存储的ASP.NET应用程序。它   只需引用Hangfire.Core,Hangfire.SqlServer和   Microsoft.Owin.Host.SystemWeb包。

  •   
  • Hangfire.Core - 基本套餐   包含Hangfire的所有核心组件。它可以用于任何   项目类型,包括ASP.NET应用程序,Windows服务,控制台,   任何与OWIN兼容的Web应用程序,Azure Worker Role等。

  •   

如您所见,HangFire可用于任何类型的项目,包括控制台应用程序,但您需要根据您将使用的作业存储类型来管理和添加所有库。 See more here

安装HangFire后,您可以将其配置为使用仪表板,该界面可以在其中找到有关后台作业的所有信息。在我工作的公司中,我们多次使用HangFire进行重复性工作,主要是为了导入用户,在应用程序之间同步信息以及执行在工作时间运行成本高昂的操作,并且当我们想要知道是否有用时,Dashboard非常有用某项工作是否正在运行。它还使用CRON来安排操作。

我们现在正在使用的样本是:

<强> Startup.cs

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        //Get the connection string of the HangFire database 
        GlobalConfiguration.Configuration.UseSqlServerStorage(connection);

        //Start HangFire Server and enable the Dashboard
        app.UseHangfireDashboard();
        app.UseHangfireServer();

        //Start HangFire Recurring Jobs
        HangfireServices.Instance.StartSendDetails();
        HangfireServices.Instance.StartDeleteDetails();
    }
}

<强> HangfireServices.cs

public class HangfireServices
{
    //.. dependency injection and other definitions

    //ID of the Recurring JOBS
    public static string SEND_SERVICE = "Send";
    public static string DELETE_SERVICE = "Delete";

    public void StartSend()
    {
        RecurringJob.AddOrUpdate(SEND_SERVICE, () =>
            Business.Send(), //this is my class that does the actual process
            HangFireConfiguration.Instance.SendCron.Record); //this is a simple class that reads an configuration CRON file
    }

    public void StartDeleteDetails()
    {
        RecurringJob.AddOrUpdate(DELETE_SERVICE, () =>
            Business.SendDelete(), //this is my class that does the actual process
            HangFireConfiguration.Instance.DeleteCron.Record); //this is a simple class that reads an configuration CRON file
    }
}

<强> HangFireConfiguration.cs

public sealed class HangFireConfiguration : ConfigurationSection
{
    private static HangFireConfiguration _instance;

    public static HangFireConfiguration Instance
    {
        get { return _instance ?? (_instance = (HangFireConfiguration)WebConfigurationManager.GetSection("hangfire")); }
    }

    [ConfigurationProperty("send_cron", IsRequired = true)]
    public CronElements SendCron
    {
        get { return (CronElements)base["send_cron"]; }
        set { base["send_cron"] = value; }
    }

    [ConfigurationProperty("delete_cron", IsRequired = true)]
    public CronElements DeleteCron
    {
        get { return (CronElements)base["delete_cron"]; }
        set { base["delete_cron"] = value; }
    }
}

<强> hangfire.config

<hangfire>
  <send_cron record="0,15,30,45 * * * *"></send_cron>
  <delete_cron record="0,15,30,45 * * * *"></delete_cron>
</hangfire>

上面的CRON表达式每天每小时运行0,15,30,45分钟。

<强>的Web.config

<configSections>

    <!-- Points to the HangFireConfiguration class -->
    <section name="hangfire" type="MyProject.Configuration.HangFireConfiguration" />

</configSections>

<!-- Points to the .config file -->
<hangfire configSource="Configs\hangfire.config" />

<强>结论

根据您描述的场景,我可能会在您的ASP.NET MVC应用程序中安装HangFire并删除控制台应用程序,这很简单,因为它是一个不用担心的项目。即使你可以将它安装在控制台应用程序上,我也不愿意遵循这条道路,因为如果你碰到了一堵砖墙(而且你会碰到,相信我),你很可能会这样做。 ll主要为在ASP.NET应用程序中安装它的情况找到帮助。

答案 1 :(得分:1)

无需任何其他控制台应用程序来更新数据库。您可以在MVC应用程序中使用hangfire。

http://docs.hangfire.io/en/latest/configuration/index.html

添加hangfire配置后,您可以使用普通的MVC方法来执行控制台操作,例如更新数据库。 根据您的要求,您可以使用

  1. BackgroundJob.Enqueue - &gt;立即更新到DB
  2. BackgroundJob.Schedule - &gt;延迟更新到DB
  3. RecurringJob.AddOrUpdate - &gt;像Windows服务一样重复更新到数据库。
  4. 以下是一个例子,

    public class MyController : Controller
    {
    
        public void MyMVCMethod(int Id)
        {
           BackgroundJob.Enqueue(() => UpdateDB(Id));  
        }
    
        public void UpdateDB(Id)
        {
          // Code to update the Database.
        }
    }