Tích hợp HangFire với ABP

Giới thiệu

Các tác vụ nền là một chức năng phổ biến trong quá trình phát triển hệ thống. Có nhiều tác vụ đòi hỏi thời gian xử lý dài mà chúng ta không cần phản hồi ngay lập tức, như nhập dữ liệu từ Excel hoặc gửi tin nhắn hàng loạt.ABP vNext hỗ trợ các tác vụ nền và tích hợp sẵn với HangFire và RabbitMQ. Các nhà phát triển có thể sử dụng những thư viện bên thứ ba này mà không cần cấu hình phức tạp.ABP vNext xây dựng trên Timer của CLR để thực hiện logic người dùng định kỳ. Quản lý tác vụ nền mặc định của ABP vNext cũng dựa trên cơ chế này.Có 6 mô-đun liên quan đến tác vụ nền, bao gồm:- Volo.Abp.Threading: Cung cấp các thành phần luồng thông dụng, trong đó AbpTimer được triển khai.

  • Volo.Abp.BackgroundWorkers: Định nghĩa và triển khai tác vụ nền.
  • Volo.Abp.BackgroundJobs.Abstractions: Một số định nghĩa chung cho tác vụ nền.
  • Volo.Abp.BackgroundJobs: Triển khai quản lý tác vụ nền mặc định.
  • Volo.Abp.BackgroundJobs.HangFire: Quản lý tác vụ nền dựa trên thư viện Hangfire.
  • Volo.Abp.BackgroundJobs.RabbitMQ: Quản lý tác vụ nền dựa trên RabbitMQ.

Hangfire là gì

Hangfire là một framework mã nguồn mở dành cho .NET, hỗ trợ .NET Core từ phiên bản 1.6+. Điểm nổi bật của nó là bảng điều khiển tích hợp, giúp dễ dàng giám sát và xem chi tiết các tác vụ nền.### Tham chiếu thư viện

<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.0.0" />
<PackageReference Include="Volo.Abp.Autofac" Version="2.0.0" />
<PackageReference Include="Hangfire.Core" Version="1.8.0" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.0" />
<PackageReference Include="Hangfire.Dashboard.Authorization" Version="1.0.3" />
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.8.0" />

Khởi động ứng dụng

public class StartupApp
   {
       public void ConfigureService(IServiceCollection svc)
       {
           svc.AddApplicationLayer();
 
           var Config = svc.GetConfig();
           GlobalStateHandlers.Listeners.Add(new TaskExpirationHandler(int.Parse(Config["Hangfire:TaskTimeout"])));
           svc.AddHostedService();
 
           svc.AddHangfire(x =>
           {
               var connString = Config["Hangfire:Redis:ConnectionString"];
               x.UseRedisStorage(connString, new RedisStorageOptions()
               {
                   // Thời gian chờ máy chủ hoạt động
                   InvisibilityTimeout = TimeSpan.FromMinutes(45),
                   Db = int.Parse(Config["Hangfire:Redis:Db"])
               });
 
               x.UseDashboardMetric(DashboardMetrics.ServerCount)
              .UseDashboardMetric(DashboardMetrics.RecurringJobCount)
              .UseDashboardMetric(DashboardMetrics.RetriesCount)
              .UseDashboardMetric(DashboardMetrics.WaitingCount)
              .UseDashboardMetric(DashboardMetrics.EnqueuedAndQueueCount)
              .UseDashboardMetric(DashboardMetrics.ScheduledCount)
              .UseDashboardMetric(DashboardMetrics.ProcessingCount)
              .UseDashboardMetric(DashboardMetrics.SuccessfulCount)
              .UseDashboardMetric(DashboardMetrics.FailedCount)
              .UseDashboardMetric(DashboardMetrics.EnqueuedCountOrNull)
              .UseDashboardMetric(DashboardMetrics.FailedCountOrNull)
              .UseDashboardMetric(DashboardMetrics.DeletedCount);
           });
       }
 
       public void Configure(IApplicationBuilder app, IConfiguration Config)
       {
           app.InitializeApp();
           app.UseAuthorization();
 
           var authFilter = new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
       {
           SslRedirect = false,
           RequireSsl = false,
           LoginCaseSensitive = false,
           Users = new[]
           {
                       new BasicAuthAuthorizationUser
                       {
                           Username = Config["Hangfire:Username"] ,
                           PasswordClear= Config["Hangfire:Password"]
                       }
           }
       });
 
           app.UseHangfireDashboard("", new DashboardOptions
           {
               Authorization = new[]
               {
                  authFilter
               },
           });
 
           var jobOptions = new BackgroundJobServerOptions
           {
               Queues = new[] { "urgent", "test", "default" },
               WorkerCount = Environment.ProcessorCount * int.Parse(Config["Hangfire:ProcessorMultiplier"]),
               ServerName = Config["Hangfire:ServerIdentifier"],
               SchedulePollingInterval = TimeSpan.FromSeconds(2), // Khoảng thời gian kiểm tra kế hoạch, hỗ trợ đến giây
           };
 
           app.UseHangfireServer(jobOptions);
       }
   }

Thiết lập

///
   /// Xử lý hết hạn cho tác vụ đã hoàn thành, tránh tăng trưởng dữ liệu vô hạn
   ///
   public class TaskExpirationHandler : IStateHandler
   {
       public TimeSpan JobTimeout;
       public TaskExpirationHandler(int taskTimeout)
       {
           JobTimeout = TimeSpan.FromMinutes(taskTimeout);
       }
 
       public string StateName => SucceededState.StateName;
       public void Apply(ApplyStateContext context, IWriteOnlyTransaction transaction)
       {
           context.JobTimeout = JobTimeout;
       }
 
       public void Unapply(ApplyStateContext context, IWriteOnlyTransaction transaction)
       {
 
       }
   }

Thẻ: ABP Hangfire .net core Redis ASP.NET Core

Đăng vào ngày 18 tháng 5 lúc 13:56