Chuyển đến nội dung chính

HangFire - Thực thi background task với SQL Server

Trong lập trình, bạn sẽ thường gặp 1 số vấn đề timeout như xử lý file lớn, import data, clean up database. Ngoài ra, bạn cần phải thiết lập thời gian để chạy schedule task như gởi report định kỳ theo tuần, theo ngày… Bạn nghĩ ngay đến Windows Service. Nhưng vấn đề là bạn cần phải host trên Windows Server. Nếu chỉ sử dụng IIS thôi thì HangFire có lẽ là sự lựa chọn tốt nhất.
HangFire bao gồm bản tính phí và bản không tính phí. Với phiên bản miễn phí, có lẽ đủ cho bạn chạy chương trình.
Bạn có thể xem thêm thông tin về HangFire tại địa chỉ: https://www.hangfire.io/
An easy way to perform background processing in .NET and .NET Core applications. No Windows Service or separate process required.
Backed by persistent storage. Open and free for commercial use. 
Có 4 loại job trong HangFire (Free):
  1. Fire-and-forgot job: thực thi 1 lần và gần như ngay lập tức sau khi khởi tạo.
  2. Delayed job: Thực thi 1 lần sau 1 khoảng thời gian quy định
  3. Recurring job: Lặp lại công việc nhiều lần dựa trên CRON schedule.
  4. Continuations: Tiếp tục thực thi công việc sau khi công việc trước đó thực hiện xong.
Trong bài viết này, mình xây dựng 2 ví dụ sử dụng HangFire trong Console Application và ASP.NET WEB API.

Thiết lập trong Console Application

Bạn cần 2 package: Hangfire.Core và Hangfire.SqlServer
Sau khi cài đặt, bạn cần 1 database SQL Server để Hangfire trỏ tới đó.
Trong app.config, bạn đặt 1 key như sau:
<add name="HangfireContext" connectionString="Server=.;Database=your-db;User ID=sa;Password=123456;MultipleActiveResultSets=True;Trusted_Connection=False;" providerName="System.Data.SqlClient" />

Trong hàm Main.cs
static void Main(string[] args)
{
 GlobalConfiguration.Configuration
  //.UseColouredConsoleLogProvider()
  .UseSqlServerStorage("HangfireContext");

 using (var server = new BackgroundJobServer())
 {
  Console.WriteLine("Hangfire Server started. Press any key to exit...");
  GetDateTime();
  BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
  BackgroundJob.Schedule(()=> ScheduleJob(), TimeSpan.FromMinutes(1));
  Console.ReadKey();
 }
}

public static void ScheduleJob()
{
 Console.WriteLine(DateTime.Now.ToLocalTime());
 Console.WriteLine("Schedule Job");
}
static void GetDateTime()
{
 Console.WriteLine(DateTime.Now.ToLocalTime());
}
Kết quả:

Thiết lập trong ASP.NET WEB API

Bạn tạo project ASP.NET WEB API.
Cài HangFire qua Nuget:
Install-Package Hangfire
Hoặc thông qua Nuget Package:

Sau khi cài đặt HangFire, bạn sẽ thấy file readme.txt, hướng dẫn cấu hình HangFire trong OWIN và trong .NET Core.

Đối với project sử dụng .NET Framework, bạn sẽ xem phần cấu hình cho OWIN.

Thêm file OWIN

Bạn tạo mới file Startup.cs với nội dung:

using Hangfire;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(HangFireWebExample.Startup))]
namespace HangFireWebExample
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration.UseSqlServerStorage(("<name or connection string>");

            app.UseHangfireDashboard();
            app.UseHangfireServer();
        }
    }
}
Bây giờ bạn chạy ứng dụng lên.
Để thấy HangFire Dashboard, bạn vào đường dẫn http:///hangfire URL. Bạn có thể thấy danh sách các jobs, servers, real-time graph và các thứ khác trong DashBoard. Mặc định Hangfire sẽ map Dashboard vào đường dẫn /hangfire. Nhưng bạn có thể thay đổi url đó bằng cách truyền tham số vào hàm UseHangfireDashboard.
app.UseHangfireDashboard("/WebJobsDashboard");
app.UseHangfireServer();
Nếu bạn mở database lên, bạn sẽ thấy HangFire sẽ tạo các table để quản lý thông tin background job.
Để theo dõi job, bạn vào Dashboard, chọn Recurring Jobs:

Download sample: https://www.mediafire.com/file/apz0abelnlxfle1

Kết luận

HangFire là 1 third party khá tốt để chạy background task cho website. Tuy nhiên, website của bạn phải luôn ở trạng thái sẵn sàng, nếu không HangFire sẽ không chạy được background task.
Nhatkyhoctap's blog

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.