🛠️ 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. FunkceAddHangfire()
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ískatIRecurringJobManager
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 zavolatContextUtils.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.
}