Работа Hangfire в решении для консоли/веб-приложения?

Я новичок в Hangfire и пытаюсь понять, как это работает.

Итак, у меня есть приложение MVC 5 и консольное приложение в одном решении. Простое консольное приложение просто обновляет некоторые данные в базе данных (изначально планировалось использовать планировщик заданий Windows).

Где именно я могу установить Hangfire? В веб-приложении или в консоли? Или мне следует преобразовать консоль в класс в веб-приложении?


person Jack    schedule 23.12.2015    source источник
comment
Какова роль вашего приложения MVC? Это как-то связано с вашим консольным приложением?   -  person Yogi    schedule 05.01.2016


Ответы (2)


Если я правильно понимаю, консоль в вашем решении действует как псевдо HangFire, поскольку, как вы сказали, она выполняет некоторые операции с базой данных сверхурочно, и вы планируете выполнять ее с помощью планировщика заданий.

Обзор HangFire

HangFire был разработан, чтобы делать с вашим консольным приложением именно то, что вы хотите, но с гораздо большей мощностью и функциональностью, поэтому вы избегаете всех накладных расходов, связанных с созданием всего этого самостоятельно.

Установка HangFire

HangFire обычно устанавливается вместе с приложениями ASP.NET, но если вы внимательно прочитаете документацию, то с удивлением обнаружите следующее:

Проект Hangfire состоит из нескольких пакетов NuGet, доступных на сайте галереи NuGet. Вот список основных пакетов, о которых вы должны знать:

  • Hangfire – пакет загрузчика, предназначенный для установки только для приложений ASP.NET, использующих SQL. Сервер как хранилище заданий. Он просто ссылается на пакеты Hangfire.Core, Hangfire.SqlServer и Microsoft.Owin.Host.SystemWeb.

  • Hangfire.Core — базовый пакет, содержащий все основные компоненты Зависание. Его можно использовать в любом типе проекта, включая приложение ASP.NET, службу Windows, консоль, любое веб-приложение, совместимое с OWIN, рабочую роль Azure и т. д.

Как видите, HangFire можно использовать в проектах любого типа, включая консольные приложения, но вам потребуется управлять всеми библиотеками и добавлять их в зависимости от того, какое хранилище заданий вы будете использовать. Подробнее здесь:

После установки HangFire вы можете настроить его для использования панели инструментов, которая представляет собой интерфейс, где вы можете найти всю информацию о ваших фоновых заданиях. В компании, в которой я работаю, мы использовали HangFire несколько раз с повторяющимися заданиями, в основном для импорта пользователей, синхронизации информации между приложениями и выполнения операций, выполнение которых было бы дорогостоящим в рабочее время, и панель мониторинга оказалась очень полезной, когда мы хотели узнать, выполнялась определенная работа или нет. Он также использует 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" />

Заключение

Учитывая сценарий, который вы описали, я бы, вероятно, установил HangFire в ваше приложение ASP.NET MVC и удалил консольное приложение, просто потому, что это на один проект меньше, о чем нужно беспокоиться. Несмотря на то, что вы можете установить его в консольное приложение, я бы предпочел не следовать этому пути, потому что, если вы наткнетесь на кирпичную стену (а вы наткнетесь, поверьте мне), скорее всего, вы найдете помощь в основном для случаев, когда он был установлен в приложениях ASP.NET.

person jpgrassi    schedule 06.01.2016
comment
Я хотел бы поставить в очередь фоновые задания только из моего приложения mvc, которое является длительной операцией, и вместо этого обработать эту длительную операцию в службе wcf/windows, которая будет находиться в помещении клиента. Хотя информация об этом приведена в документах Hangfire, но они не показал любую конфигурацию, связанную с этим: docs .hangfire.io/en/latest/background-processing/ - person Learning-Overthinker-Confused; 30.01.2018

Больше нет необходимости в консольном приложении для обновления базы данных. Вы можете использовать Hangfire в самом приложении MVC.

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

После добавления конфигурации Hangfire вы можете использовать обычный метод MVC для выполнения консольных операций, таких как обновление БД. В зависимости от вашего требования вы можете использовать

  1. BackgroundJob.Enqueue --> Немедленное обновление в БД
  2. BackgroundJob.Schedule --> Отложенное обновление БД
  3. RecurringJob.AddOrUpdate --> Повторяющееся обновление БД, например службы Windows.

Ниже приведен пример,

public class MyController : Controller
{

    public void MyMVCMethod(int Id)
    {
       BackgroundJob.Enqueue(() => UpdateDB(Id));  
    }

    public void UpdateDB(Id)
    {
      // Code to update the Database.
    }
}
person Linoy    schedule 05.01.2016
comment
что произойдет, если веб-приложение переработано из IIS и не запущено, потому что ни один пользователь не посетил сайт в 2 часа ночи, когда я запланировал свою задачу. Будет ли задача по-прежнему выполняться? - person MIKE; 29.01.2016
comment
@MIKE: Для этого вам нужно постоянно работать в своем приложении. docs.hangfire.io/ ru/latest/deployment-to-production/ - person Linoy; 29.01.2016
comment
@MIKE: я думаю, что когда запланированное время превышается, оно не будет работать. - person Linoy; 29.01.2016
comment
Это означает, что мне нужно будет постоянно поддерживать 4-5 рабочих приложений. Будет ли это проблемой? - person MIKE; 29.01.2016
comment
@MIKE Создайте только одно приложение под названием HangFire и заставьте его использовать HangFireServer. Пусть у этого приложения всегда будет собственный пул приложений. Когда вы ставите задания в очередь в хранилище HangFire, это приложение HangFire будет собирать задания (независимо от вашего приложения) и выполнять их. - person Jack; 28.06.2017