Tác vụ nền trong ASP.NET Core với NCronJob va SignalR

Toi duoc gioi thieu ve NCronJob de trien khai worker chay nen trong ASP.NET Core, vi vay toi da thu nghiem, doc tai lieu va tim hieu cach su dung. Goi NuGet nay la ma nguon mo va hoat dong rat tot. Toi da trien khai hai job don gian: mot job cho phep chay dong thoi va mot job khong chay dong thoi, trong do cac thong diep duoc gui qua SignalR.

Ma nguon cua vi du co tai: https://github.com/damienbod/AspNetCoreNCronJob

De tao tinh nang minh hoa, toi su dung mot dich vu SignalR de hien thi ca thong diep tu job dong thoi va job khong dong thoi trong giao dien ASP.NET Core Razor Pages. Khi co the, cac thong diep duoc gui moi nam giay. Trong ASP.NET Core, viec nay chi can trien khai mot Hub. Trong vi du nay, toi tao hai phuong thuc:

using Microsoft.AspNetCore.SignalR;

namespace AspNetCoreNCronJob;

public class JobsHub : Hub
{
    public Task SendConcurrentJobsMessage(string message)
    {
        return Clients.All.SendAsync("ConcurrentJobs", message);
    }

    public Task SendNonConcurrentJobsMessage(string message)
    {
        return Clients.All.SendAsync("NonConcurrentJobs", message);
    }
}

NCronJob la mot lop don gian trien khai giao dien IJob. Phuong thuc RunAsync se duoc chay tuy theo cach giao dien nay duoc cau hinh trong phan dinh nghia dich vu. Lop nay su dung dependency injection va gui thong diep den cac client SignalR da dang ky.

using Microsoft.AspNetCore.SignalR;
using NCronJob;

namespace AspNetCoreNCronJob.NCronJobServices;

[SupportsConcurrency(5)]
public class NonConconcurrentJob : IJob
{
    private readonly ILogger<NonConconcurrentJob> _logger;
    private static int _counter = 0;
    private readonly IHubContext<JobsHub> _hubContext;

    public NonConconcurrentJob(
        ILogger<NonConconcurrentJob> logger,
        IHubContext<JobsHub> hubContext)
    {
        _logger = logger;
        _hubContext = hubContext;
    }

    public async Task RunAsync(
        IJobExecutionContext context,
        CancellationToken token)
    {
        var count = _counter++;
        var beginMessage = $"NonConcurrentJob Job BEGIN {count} {DateTime.UtcNow}";

        await _hubContext.Clients.All.SendAsync(
            "NonConcurrentJobs",
            beginMessage);

        _logger.LogInformation("{BeginMessage}", beginMessage);

        await Task.Delay(7000, token);

        var endMessage = $"NonConcurrentJob Job END {count} {DateTime.UtcNow}";

        await _hubContext.Clients.All.SendAsync(
            "NonConcurrentJobs",
            endMessage);

        _logger.LogInformation("{EndMessage}", endMessage);
    }
}

Giao dien ASP.NET Core su dung thu vien JavaScript cua SignalR de ket noi den may chu SignalR va tiep nhan cac thong diep. Cac thong diep sau do duoc hien thi tren giao dien.

Giao dien chay job khong dong thoi trong ASP.NET Core

Cach su dung nay rat don gian va cung cap day du cac tinh nang ma toi can cho hau het yeu cau lap lich cua minh.

Lien ket tham khao