Chybí Vám SheduleTasks v Xperience by Kentico? Integrujte Hangfire!

18.09.2024
Model.AuthorName
Milan Sustek

🛠️ Ideální náhrada za nezbytný nástroj.

Pokud jste jako developer pracovali s Kentico, pravděpodobně jste modul Kentico Schedule Task využili. Usnadňuje podstatnou část práce, umožňuje totiž automatizovat procesy, spravovat úlohy na pozadí a plánovat opakující se operace v rámci aplikací.

S novým Xperience by Kentico se může zdát, že budete tento klíčový modul postrádat. Tento zádrhel je ale snadno řešitelný díky dostupnosti populárních open-source alternativ, jako je Hangfire.

V tomto článku vás provedu celým procesem nastavení Hangfire Recurring Jobs jako náhradu za Kentico Schedule Task module.
 

💡 Proč jsem zvolil Hangfire?

Hangfire je populární open-source knihovna určená pro správu a provádění úloh na pozadí v aplikacích .NET. Poskytuje robustní rámec pro vytváření, zpracování a monitorování úloh a umožňuje vývojářům snadno odložit časově náročné úlohy na pozadí.

Jednou z atraktivních funkcí Hangfire je intuitivní uživatelské rozhraní ovládacího panelu, které poskytuje přehled o stavu úloh v reálném čase. Tento přístrojový panel umožňuje nejen sledovat probíhající úlohy, ale také vám dává možnost ručně spouštět úlohy na vyžádání, čímž přidává další vrstvu kontroly a pohodlí při zpracování aplikací na pozadí.

Předpoklady

Než začneme, ujistěte se že používáte funkční Xperience by Kentico aplikaci, jako je Dancing Goat template.

1. krok: Instalace Hangfire Packages

Začneme základním nastavením Hangfire podle pokynů na stránce Hangfire - Getting started.

Nejprve je třeba do projektu přidat potřebné balíčky NuGet. Otevřete terminál a spusťte následující příkazy:
dotnet add package Hangfire.Core
dotnet add package Hangfire.SqlServer
dotnet add package Hangfire.AspNetCore

Tyto balíčky obsahují vše, co potřebujete k integraci Hangire do vaší Xperience aplikace.
 

2. krok: Konfigurace Hangfire Services

Dále je třeba zaregistrovat potřebné služby. Funkce AddHangfire() nastaví služby pro vytváření front a funkce AddHangfireServer nastaví služby pro zpracování.
builder.Services.AddHangfire(c =>
{
    // Configure SQL Server as a job storage.
    c.UseSqlServerStorage(
        // Obtain Kentico Database connection string.
        builder.Configuration.GetConnectionString(
            ConnectionHelper.ConnectionStringName));
});

// Add Hangfire Server which processes background jobs.
builder.Services.AddHangfireServer();

3. Krok: Namapujte Hangfire Dashboard

K monitorování a správě úloh na pozadí poskytuje Hangfire dashboard UI.

Uživatelské rozhraní Hangfire Dashboard můžete jednoduše namapovat zavoláním MapHangfireDashboard. Volitelně nastavte vlastní zásady autorizace nebo vyberte možnost XperienceAdministrationAccessPolicy. XperienceAdministrationAccessPolicy je integrovaná zásada v Xperience by Kentico, která zajišťuje, že palubní desku mohou zobrazit pouze ověření uživatelé s administrátorským přístupem.
// Map Hangfire Dashboard UI and setup required authorization
app.MapHangfireDashboard(new DashboardOptions
{
    Authorization = []
}).RequireAuthorization("XperienceAdministrationAccessPolicy");


Volitelně můžete nakonfigurovat pojmenované CookieAuthenticationOptions, abyste zadali vlastní cestu přesměrování pro neautorizované požadavky. Bez této konfigurace mohou být uživatelé přesměrováni na výchozí neexistující cestu /Account/Login.

// Setup redirect path for unauthorized requests.
builder.Services.Configure<CookieAuthenticationOptions>(
    AdminIdentityConstants.APPLICATION_SCHEME,
    o =>
    {
        o.LoginPath = "/admin/logon";
    });

4. Krok: Naplánování opakujících se úloh

Nyní, když je vše nastaveno, můžete plánovat úlohy na pozadí, např. pro naplánování opakující se úlohy stačí získat IRecurringJobManager z dependency injection container a zavolat jeho metodu AddOrUpdate. Zde je příklad, jak naplánovat úlohu, která se spouští každou minutu:
// Get IRecurringJobManager service from the application dependency injection container.
var manager = app.Services.GetRequiredService<IRecurringJobManager>();

// Configure desired schedule tasks.
manager.AddOrUpdate(
    "ScheduleTasks.TestJob",
    () => ScheduleTasks.TestJob(),
    Cron.Minutely());

Step 5: Handle Xperience Database Connections

Když vaše úlohy na pozadí komunikují s databází Xperience by Kentico prostřednictvím rozhraní Xperience API, musíte zavolat ContextUtils.ResetCurrent(), abyste resetovali jakýkoli okolní kontext, což může zabránit vytvoření nového databázového připojení a může selhat s výjimkami, jak je uvedeno v documentaci.
class ScheduleTasks
{
    public static async Task TestJob()
    {
        // Reset current thread context so each invocation gets the new one for proper handling of database connections.
        ContextUtils.ResetCurrent();

        // Example of a scheduled task logic - fetching user info from Kentico Xperience.
        await UserInfo.Provider.Get().GetEnumerableTypedResultAsync();

        // Additional logic for processing users or other tasks.
    }


Závěr

Podle těchto kroků můžete snadno integrovat Hangfire do svého projektu Xperience by Kentico a nahradit tradiční modul Schedule Task dostupným open-source řešením 😊.

Celé řešení najdete na Githubu: https://github.com/BiQ-Bluesoft/xperience-by-kentico-schedule-tasks