您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。