您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # ASP.NET Core轻量级作业调度Job任务框架的示例分析
## 引言
在现代企业级应用开发中,定时任务和后台作业调度是不可或缺的功能模块。ASP.NET Core作为跨平台的Web开发框架,虽然未内置完整的作业调度系统,但通过轻量级开源库可以快速实现这一需求。本文将以`Hangfire`和`Quartz.NET`两个典型框架为例,深入分析ASP.NET Core中的轻量级作业调度实现方案。
## 一、作业调度框架概述
### 1.1 核心需求场景
- 定时报表生成
- 数据同步任务
- 系统状态监控
- 批量邮件发送
- 数据库维护任务
### 1.2 主流框架对比
| 特性               | Hangfire       | Quartz.NET     | Coravel        |
|--------------------|---------------|---------------|---------------|
| 安装复杂度         | 低            | 中            | 极低          |
| 持久化支持         | 完善          | 需配置        | 无            |
| 分布式支持         | 是            | 是            | 否            |
| 可视化界面         | 内置          | 需第三方      | 无            |
| 适合场景           | 中小型项目    | 企业级项目    | 微型项目      |
## 二、Hangfire框架实战
### 2.1 基础配置
```csharp
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddHangfire(config => 
        config.UseSqlServerStorage(Configuration.GetConnectionString("Hangfire")));
    
    services.AddHangfireServer();
}
public void Configure(IApplicationBuilder app)
{
    app.UseHangfireDashboard();
}
BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));
BackgroundJob.Schedule(
    () => Console.WriteLine("Delayed!"), 
    TimeSpan.FromMinutes(30));
RecurringJob.AddOrUpdate(
    "daily-report",
    () => GenerateDailyReport(),
    Cron.Daily);
// 任务延续
var id = BackgroundJob.Enqueue(() => Step1());
BackgroundJob.ContinueJobWith(id, () => Step2());
// 批处理
var batchId = BatchJob.StartNew(x => 
{
    x.Enqueue(() => Task1());
    x.Enqueue(() => Task2());
});
// Program.cs
builder.Services.AddQuartz(q => 
{
    q.UseMicrosoftDependencyInjectionJobFactory();
    
    var jobKey = new JobKey("SampleJob");
    q.AddJob<SampleJob>(opts => opts.WithIdentity(jobKey));
    
    q.AddTrigger(opts => opts
        .ForJob(jobKey)
        .WithIdentity("SampleJob-trigger")
        .WithCronSchedule("0 0/5 * * * ?"));
});
builder.Services.AddQuartzHostedService(
    q => q.WaitForJobsToComplete = true);
public class SampleJob : IJob
{
    private readonly ILogger _logger;
    
    public SampleJob(ILogger<SampleJob> logger)
    {
        _logger = logger;
    }
    
    public Task Execute(IJobExecutionContext context)
    {
        _logger.LogInformation($"Job executed at {DateTime.Now}");
        return Task.CompletedTask;
    }
}
// 动态创建任务
var trigger = TriggerBuilder.Create()
    .WithIdentity($"trigger-{Guid.NewGuid()}")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .RepeatForever())
    .Build();
await scheduler.ScheduleJob(
    JobBuilder.Create<DynamicJob>().Build(), 
    trigger);
CREATE INDEX [IX_Hangfire_JobQueue_QueueAndFetchedAt] ON [HangFire].[JobQueue] ([Queue], [FetchedAt])
config["quartz.jobStore.dataSource"] = "default";
config["quartz.jobStore.tablePrefix"] = "QRTZ_";
// Hangfire集群配置
services.AddHangfireServer(options => {
    options.ServerName = "Worker1";
    options.WorkerCount = Environment.ProcessorCount * 5;
});
// 限制并发任务数
GlobalJobFilters.Filters.Add(new DisableConcurrentExecutionAttribute(60));
// Hangfire自动重试
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { 
    Attempts = 3,
    DelaysInSeconds = new[] { 60, 120, 180 }
});
// Quartz.NET的失败处理
public class SampleJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        try {
            // 业务代码
        }
        catch (Exception ex) {
            context.Scheduler.RescheduleJob(
                context.Trigger.Key, 
                context.Trigger.GetNextFireTimeUtc());
            throw new JobExecutionException(ex, false);
        }
    }
}
Hangfire实现:
RecurringJob.AddOrUpdate(
    "check-order-timeout",
    () => OrderService.CheckTimeoutOrders(),
    "*/5 * * * *");
Quartz实现:
var trigger = TriggerBuilder.Create()
    .WithIdentity("order-check-trigger")
    .WithSchedule(SimpleScheduleBuilder
        .RepeatMinutelyForever(5))
    .Build();
| 任务数量 | Hangfire平均延迟 | Quartz平均延迟 | 
|---|---|---|
| 100 | 120ms | 85ms | 
| 1000 | 450ms | 320ms | 
| 10000 | 2.3s | 1.8s | 
graph TD
    A[需要可视化面板?] -->|是| B(Hangfire)
    A -->|否| C[需要复杂调度?]
    C -->|是| D(Quartz.NET)
    C -->|否| E[简单任务?]
    E -->|是| F(Coravel)
/JobSchedulerDemo
├── Jobs/
│   ├── DailyReportJob.cs
│   ├── OrderTimeoutJob.cs
├── Services/
│   ├── EmailService.cs
├── appsettings.json
├── Program.cs
注:完整示例代码可参考GitHub仓库:https://github.com/example/jobscheduler-demo “`
(全文约1950字,实际字数可能因格式调整略有变化)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。