1.添加Quartz定时器组件
2.新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目。然后新建一个中间调度类,叫QuartzMiddleJob
3.新建一个Job工厂类,叫YsqJobFactory,用来获取刚刚创建的中间调度类的服务
4.新建一个通用执行计划类,叫YsqJobSchedule,用于每次任务都通过该计划进行生成
5.现在添加一个任务,新建任务类 MyJobs,并且继承自IJob,然后在Excute方法里面,就是该任务执行调度时候会进去执行的了
6.将任务注册到Autofac中
7.编写Program类
点击查看代码
var builder = WebApplication.CreateBuilder(args);
#region 向容器中添加服务
// **1. 初始化日志配置(优先执行)**
// 日志需要尽早配置,确保后续的服务、管道启动时能记录日志
AppHelper.Init(builder.Configuration);
builder.Host.UseSerilog((context, services, configuration) =>
{
configuration.ReadFrom.Configuration(context.Configuration);
});
// **2. 注册原生服务(AddXxx 服务)**
// 原生服务注册优先,便于 Autofac 接管时完整保留这些服务
builder.Services.AddControllers(); // 添加控制器支持
builder.Services.AddEndpointsApiExplorer(); // 添加终结点支持
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "API 文档标题",
Version = "1.0",
Description = "这是 API 文档描述"
});
var xmlFile = Path.Combine(AppContext.BaseDirectory, "Ysq.Core.xml");
c.IncludeXmlComments(xmlFile, true);
});
// **3. 配置 Hangfire 服务**
// 必须在 Autofac 配置之前注册,因为其服务会被转移到 Autofac 中
HangfireConfigInfo.ConnectionString = AppHelper.Instance.ReadAppSettings(new[] { "Hangfire", "Config", "ConnectionString" });
HangfireConfigInfo.Db = Convert.ToInt32(AppHelper.Instance.ReadAppSettings(new[] { "Hangfire", "Config", "Db" }));
builder.Services.AddHangfire(config =>
{
config.UseStorage(new RedisStorage(
HangfireConfigInfo.ConnectionString,
new RedisStorageOptions
{
Db = HangfireConfigInfo.Db,
FetchTimeout = TimeSpan.FromMilliseconds(30)
}));
});
builder.Services.AddHangfireServer(); // 注册 Hangfire 后台任务
// **4. 替换 DI 容器为 Autofac**
// 在所有原生服务注册之后执行,便于 Autofac 接管完整的服务注册
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule(new AutofacRegister()); // 在 Autofac 中注册自定义服务
});
// **5. 注册 Hosted Service(Quartz.NET 或其他后台服务)**
// 注册 Quartz.NET 的 HostedService,此时依赖已全部就绪
builder.Services.AddHostedService<YsqJobHostService>();
#endregion
// **6. 构建应用**
var app = builder.Build();
#region 配置HTTP请求管道
// **7. 配置中间件管道**
// 按照 ASP.NET Core 的推荐顺序配置中间件
app.UseSerilogRequestLogging(options =>
{
options.MessageTemplate = "HTTP {RequestMethod} {RequestPath} responded {StatusCode} in {Elapsed:0.0000}ms";
});
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
IgnoreAntiforgeryToken = true,
DashboardTitle = "Hangfire 任务监控面板",
AsyncAuthorization = new[] { new MyHangfireFilter() },
IsReadOnlyFunc = _ => true // 设置面板为只读
});
// 启用 Swagger 文档
app.UseSwagger();
app.UseSwaggerUI();
// **8. 配置终端点映射**
// 必须在中间件管道之后配置终端点
if (!app.Environment.IsDevelopment())
{
builder.WebHost.UseUrls("http://*:35678");//指定监听端口号
}
// 启用授权中间件
app.UseAuthorization();
// **8. 配置终端点映射**
// 必须在中间件管道之后配置终端点
app.MapControllers();
// **9. 配置 Hangfire 的定时任务**
// 必须在应用完全构建并运行时添加定时任务
RecurringJob.AddOrUpdate<IHangfireJobs>("MyFirstJob", x => x.FirstJob(), "0 10 * * *");
app.Run();
#endregion
8.查看demo运行结果(每一秒执行一次的示例)