Zum Inhalt

Hintergrundjobs

Jobs laufen auf Hangfire mit dem Speicher des Datenbank-Providers: Postgres, SQL Server oder bei SQLite im Arbeitsspeicher. Ein Job läuft als der Benutzer, der ihn eingereiht hat; Berechtigungen, Mandantenfilter und Audit funktionieren wie in einem Request.

public sealed record RenderPreview(Guid AssetId);

internal sealed class RenderPreviewJob(IDispatcher dispatcher) : IBackgroundJob<RenderPreview>
{
    public Task ExecuteAsync(RenderPreview args, CancellationToken cancellationToken) =>
        dispatcher.SendAsync(new CreatePreviewCommand(args.AssetId), cancellationToken);
}

jobs.Enqueue<RenderPreviewJob, RenderPreview>(new RenderPreview(asset.Id), queue: "processing");
jobs.Schedule<RenderPreviewJob, RenderPreview>(new RenderPreview(asset.Id), TimeSpan.FromMinutes(5));

Wiederkehrende Jobs laufen ohne Benutzer und Mandant:

internal sealed class CleanupJob : IRecurringJob
{
    public Task ExecuteAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

services.AddRecurringJob<CleanupJob>("cleanup", "0 3 * * *");

Arbeit in jeder Organisation läuft über TenantJobRunner: einmal pro aktiver Organisation, als System dieser Organisation (Mandantenfilter, Audit) und in einem eigenen DI-Scope. Eine fehlschlagende Organisation wird protokolliert und zurückgegeben, die anderen laufen weiter:

internal sealed class ReminderJob(TenantJobRunner tenants) : IRecurringJob
{
    public async Task ExecuteAsync(CancellationToken cancellationToken) =>
        await tenants.ForEachTenantAsync((services, tenantId, ct) =>
            services.GetRequiredService<IDispatcher>().SendAsync(new SendReminders(), ct), cancellationToken);
}

ForTenantsAsync(tenantIds, ...) macht dasselbe für die Organisationen, die eine Abfrage gefunden hat (fällige Zeilen nach TenantId gruppiert), so kosten Organisationen ohne Arbeit nichts. ForEachTenantAsync holt die Organisationen über das Identity-Modul. Der Lauf ist sequenziell; bei vielen Organisationen die Arbeit pro Organisation kurz halten.

Coworkee:Jobs
RunServer Jobs in diesem Host verarbeiten (der AppHost schaltet das für den Auth-Server ab)
Queues Warteschlangen dieses Hosts, Standard default, mail
WorkerCount parallele Worker (5)
Attempts, RetryDelaysInSeconds Wiederholungen

Das Hangfire-Dashboard liegt unter /admin/jobs, für Benutzer mit der Job-Berechtigung; die Admin-Seite Dienste zeigt es als Kachel. Blockiere nie einen Job, um auf einen anderen zu warten; plane stattdessen einen Folgejob ein.