本文内容介绍:在.NET Core项目中,结合SQLServer和SQLSugar框架实现Hangfire定时任务调度。

什么是 Hangfire?

Hangfire 是一个 .NET 库,用于管理后台任务。它提供了一种简单的方法来执行长时间运行的任务,例如发送电子邮件,生成报表,处理消息队列等。与其他后台任务调度库不同的是,Hangfire 提供了一个可靠的机制,可以在任务失败时自动重试,以确保任务始终被执行。Hangfire 还提供了一个简单的 Web 界面,可以查看任务状态、执行历史和性能指标。

Hangfire 的主要优点包括:

  • 简单易用。Hangfire 提供了一个简单的 API,让您可以快速地定义和执行后台任务。
  • 可靠性高。Hangfire 提供了一种可靠的机制,可以在任务失败时自动重试,以确保任务始终被执行。
  • 灵活性高。Hangfire 可以与多种存储后端集成,包括 SQL Server,Redis,MongoDB 等,可以满足不同应用程序的需求。

一.Hangfire配置

第一步:安装必要的NuGet包

我的项目是.Net6的版本,打开你的命令行窗口,导航到项目目录,并执行以下命令以安装所需的NuGet包:

#我是通过命令行来下载,也可以通过Nuget包管理器进行下载
dotnet add package Hangfire
dotnet add package Hangfire.SqlServer
dotnet add package SqlSugar
这些包的作用如下:
  • Hangfire:用于在后台执行任务的库。
  • Hangfire.SqlServer:Hangfire的SQL Server存储功能。
  • SqlSugar:一个简单的ORM库,用于操作数据库。

第二步:创建和配置你的应用程序

  1. 打开Program.cs文件:这是.NET 6 Minimal API的入口点。
  2. 配置Hangfire和SqlSugar:在Program.cs中,添加以下代码,以设置Hangfire和SqlSugar。
using Hangfire;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;

var builder = WebApplication.CreateBuilder(args);

// 1. 配置 SqlSugar
builder.Services.AddScoped<ISqlSugarClient>(db => 
{
    return new SqlSugarClient(new ConnectionConfig()
    {
        ConnectionString = "your_connection_string",  // 替换为你的数据库连接字符串
        DbType = DbType.SqlServer, // 使用的数据库类型
        IsAutoCloseConnection = true, // 自动关闭连接
        InitKeyType = InitKeyType.Attribute, // 初始化键类型为特性
    });
});

// 2. 配置 Hangfire
GlobalConfiguration.Configuration.UseSqlServerStorage("your_connection_string"); // 设置Hangfire使用的SQL Server存储
builder.Services.AddHangfire(x => x.UseSqlServerStorage("your_connection_string")); // 注册Hangfire服务
builder.Services.AddHangfireServer(); // 添加Hangfire服务器,以执行后台任务

var app = builder.Build();

// 3. 启用 Hangfire 仪表板
app.UseHangfireDashboard(); // 启动Hangfire仪表板,可以在浏览器中监控任务

// 4. 定义定时任务
RecurringJob.AddOrUpdate<MyJobService>(
    "jobName",  // 任务的唯一标识
    x => x.ExecuteTask(), // 实际执行的任务
    Cron.Hourly); // 使用Cron表达式,每小时执行一次

app.MapGet("/", () => "Welcome to Hangfire with SQL Server!"); // 主入口

app.Run(); // 启动应用程序

// 5. 定义任务服务类
public class MyJobService
{
    public void ExecuteTask()
    {
        // 这里实现你的具体任务逻辑
        Console.WriteLine($"任务执行中,时间: {DateTime.Now}"); // 显示当前时间
    }
}
代码解释:
  • builder.Services.AddScoped<ISqlSugarClient>:这段代码将SqlSugar的数据库上下文注册到依赖注入容器中,后续可以通过构造函数注入使用。
  • GlobalConfiguration.Configuration.UseSqlServerStorage:指定Hangfire存储使用SQL Server。此连接字符串应与SqlSugar的连接串一致。
  • app.UseHangfireDashboard():启用Hangfire的仪表板,允许你通过Web界面查看和管理后台任务。
  • RecurringJob.AddOrUpdate:这个方法用于添加或更新一个定时任务。MyJobService是定义的服务类,ExecuteTask是要执行的方法。
  • Cron.Hourly:这是一个Cron表达式,指定该任务每小时运行一次。

第三步:访问Hangfire仪表板

  1. 运行你的应用程序:
#直接F5启动/命令行
dotnet run
  1. 打开浏览器,访问 http://localhost:5000/hangfire(端口号视你的实际设置而定)。
  2. 在Hangfire仪表板上,你可以查看任务的状态,执行历史记录,以及手动触发任务等。

第四步:查看和调试任务输出

在控制台中,你将看到任务执行中,时间: <当前时间>的输出,表示你的定时任务正在正常执行。这将每小时打印一次。

这样就在ASP.NET Core 中配置好了Hangfire定时调度基本框架。

我这里有一个简单的Hangfire实例,仅供参考!!!

二.Hangfire定时任务实例

定时发送邮件的完整流程

1. 安装必要的 NuGet 包

在你的 .NET 6 项目中,使用以下命令安装 Hangfire 和邮件发送所需的包:

dotnet add package Hangfire
dotnet add package Hangfire.SqlServer
dotnet add package MimeKit
dotnet add package MailKit

2. 创建项目文件

以下是一个示例项目结构:

/EmailScheduler
    ├── EmailScheduler.csproj
    ├── Program.cs
    └── Services
        └── EmailService.cs

3. 在 Program.cs 中配置 Hangfire 和邮件服务

using Hangfire;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net;
using System.Net.Mail;

var builder = WebApplication.CreateBuilder(args);

// 1. 配置 Hangfire 使用 SQL Server
builder.Services.AddHangfire(configuration =>
    configuration.UseSqlServerStorage("YourConnectionString"));  // 替换为你的数据库连接字符串
builder.Services.AddHangfireServer();

// 2. 注册电子邮件服务
builder.Services.AddTransient<EmailService>();

var app = builder.Build();

// 3. 启用 Hangfire 仪表板
app.UseHangfireDashboard();

// 4. 定义定时任务,设置每天上午 9 点发送邮件
var emailService = app.Services.GetRequiredService<EmailService>();
RecurringJob.AddOrUpdate<EmailService>(
    "daily-email-job",
    service => service.SendDailyEmail("user@example.com"), // 设置收件人邮箱
    Cron.Daily(9, 0)); // 每天上午 9 点执行

app.MapGet("/", () => "Hangfire Email Scheduler is running!");

app.Run();

4. 创建 EmailService.cs 类来实现发送邮件的功能

using System;
using System.Net;
using System.Net.Mail;
using System.Threading.Tasks;

namespace EmailScheduler.Services
{
    public class EmailService
    {
        private readonly string _smtpServer = "smtp.example.com"; // 替换为你的 SMTP 服务器
        private readonly int _smtpPort = 587; // SMTP 端口
        private readonly string _username = "your-email@example.com"; // SMTP 用户名
        private readonly string _password = "your-email-password"; // SMTP 密码

        // 发送每日邮件的方法
        public async Task SendDailyEmail(string toEmail)
        {
            try
            {
               // 创建邮件对象
                var mailMessage = new MailMessage
                {
                    From = new MailAddress(_username),
                    Subject = "每日提醒邮件",
                    Body = "<h1>早上好!这是您每日的提醒邮件。</h1>",
                    IsBodyHtml = true,
                };
                mailMessage.To.Add(toEmail);

                // 配置 SMTP 客户端
                using var smtpClient = new SmtpClient(_smtpServer, _smtpPort)
                {
                    Credentials = new NetworkCredential(_username, _password),
                    EnableSsl = true, // 启用 SSL
                    DeliveryMethod = SmtpDeliveryMethod.Network
                };

                // 发送邮件
                await smtpClient.SendMailAsync(mailMessage);
                Console.WriteLine($"邮件成功发送到 {toEmail} 在 {DateTime.Now}");
            }
            catch (Exception ex)
            {
                // 捕获并打印异常
                Console.WriteLine($"发送邮件时出错: {ex.Message}");
            }
        }
    }
}

5. 更新连接字符串

appsettings.json 文件中,添加连接字符串:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=your_server;Database=your_database;User Id=your_user;Password=your_password;"
  }
}

6. 运行应用

确保你已启动数据库并创建必要的 Hangfire 表。然后运行应用:

dotnet run

7. 访问 Hangfire Dashboard

打开浏览器,访问 http://localhost:5000/hangfire 以查看 Hangfire 仪表板,确认定时任务已成功添加。

可参考

https://easy-dotnet.com/pages/4e1237/#%E4%BB%80%E4%B9%88%E6%98%AF-hangfire

https://www.cnblogs.com/Can-daydayup/p/11610747.html