首页 > 数据库 >(九).NET6.0搭建基于Redis的Hangfire定时器

(九).NET6.0搭建基于Redis的Hangfire定时器

时间:2024-12-27 11:47:15浏览次数:3  
标签:Core Autofac Redis builder Hangfire new using NET6.0

1.首先创建新的类库项目 Wsk.Core.Hangfire,然后在Wsk.Core.Package包项目下引用hangfire有关的组件,包括 Hangfire、Hangfire.Core、Hangfire.Redis、Hangfire.Redis.StaskExchange

2.在配置文件新增基于redis的hangfire的数据库连接

3.在Wsk.Core.Hangfire项目下,新增Hangfire连接Redis的配置实体类

4.在Wsk.Core.Hangfire类库项目下,新建一个过滤器MyHangfireFilter,用于允许远程访问Hangfire的可视化面板

5.写一个定时任务,新建类HangfireJobs,并且提供一个无参方法FirstJob以及对应接口

6.在Autofac中注入服务

7.program中配置

点击查看代码
using Autofac.Extensions.DependencyInjection;
using Autofac;
using Microsoft.OpenApi.Models;
using Ysq.Core.Service;
using Ysq.Core.Register;
using Serilog.Events;
using Serilog;
using Ysq.Core.AppSettings;
using Ysq.Core.Hangfire;
using Hangfire;
using Ysq_Core.Entity;
using Hangfire.Redis.StackExchange;
using Hangfire.Dashboard;




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 中注册自定义服务
});
#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 // 设置面板为只读
});

app.UseSwagger(); // 启用 Swagger 文档
app.UseSwaggerUI();
app.UseAuthorization(); // 启用授权中间件

// **8. 配置终端点映射**
// 必须在中间件管道之后配置终端点
if (!app.Environment.IsDevelopment())
{
    builder.WebHost.UseUrls("http://*:35678");//指定监听端口号
}

// **9. 配置 Hangfire 的定时任务**
// 必须在应用完全构建并运行时添加定时任务
RecurringJob.AddOrUpdate<IHangfireJobs>("MyFirstJob", x => x.FirstJob(), "0 10 * * *");

app.Run();
#endregion

8.查看执行结果

标签:Core,Autofac,Redis,builder,Hangfire,new,using,NET6.0
From: https://www.cnblogs.com/sq1201/p/18635265

相关文章

  • (十).NET6.0 搭建基于Quartz组件的定时调度任务
    1.添加Quartz定时器组件2.新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目。然后新建一个中间调度类,叫QuartzMiddleJob3.新建一个Job工厂类,叫YsqJobFactory,用来获取刚刚创建的中间调度类的服务4.新建一个通用执行计划类,叫YsqJobSchedule,用于每次任务都通过该计划进行......
  • (七).NET6.0部署RabbitMQ
    1.下载erlang语言包OTP。官网地址:https://www.erlang.org/downloads2.Rabbitmq官网下载地址:https://www.rabbitmq.com/download.html需要先安装Erlang语言包,然后再安装RabbitMQ,安装RabbitMQ的服务器名称(电脑名称),以及用户名称,不要带中文,有可能会导致服务无法识别服务器,导致一......
  • (八).NET6.0添加通用的Redis功能
    1.添加包:StackExchange.Redis2.在配置文件里面,新建Redis的有关配置信息Name是别名,可以任意起。Ip是Redis的服务端地址,例如安装本地,就是127.0.0.1,端口号Port默认是6379,密码可以通过Redis安装的根目录下的配置文件进行设置,Timeout是连接的超时时间,Db是使用Redis的DB区,一般Redis......
  • (六).NET6.0通用读取配置文件功能
    1.新增Microsoft.Extensions.Configuration包在启动项目下,设置appsettings.json属性为始终复制2.新建一个文件夹Common,用于存放工具类项目。并且新建项目:Ysq.Core.AppSettings,引用package包项目,然后新建一个读取配置文件的通用类,叫AppHelper。目录结构如图3.AppHelper代码如......
  • (五).NET6.0使用Serilog进行配置和实现日志记录
    1.首先安装Serilog六件套神装包也可以对个别相应的包进行删除等,例如:1是读取配置文件的,如果不需要通过配置文件进行操作,就可以不使用这个包。2是打印到控制台的,如果不需要打印到控制台,也可以不引用。3是写入到文件的,如果不需要写入到文件,也是可以不提供的。我在此处全部引入,方便......
  • PHP语言laravel框架中基于Redis的异步队列使用实践与原理
    在Laravel中,基于Redis的异步队列是通过Laravel的队列系统与Redis服务结合来实现的。这种队列机制允许你将任务推送到队列中,并由后台工作进程异步处理这些任务。这样,你就可以将耗时的操作(如发送邮件、处理视频、数据同步等)推迟到后台处理,从而提高应用的响应速度。###1......
  • Redis 性能优化策略
    一、引言在当今数字化时代,Redis作为一款高性能的键值对存储数据库,在众多领域中发挥着关键作用。无论是应对高并发的Web应用场景,还是满足大数据量下的快速读写需求,Redis都展现出了卓越的性能优势。然而,随着业务的不断拓展和数据量的持续增长,如何进一步优化Redis的性能,使......
  • 中型项目中 Redis 的关键作用
    一、引言在中型项目的开发与运维过程中,随着业务量的增长和数据复杂度的提升,数据处理和存储面临着诸多挑战。例如,高并发场景下的数据读写压力、海量数据的快速查询需求以及数据一致性的保障等问题,都对项目的性能和稳定性提出了更高的要求。而Redis作为一款高性能的内存数据库......
  • Redis是什么,怎么安装使用
    ###Redis是什么?Redis(**RE**mote**DI**ctionary**S**erver)是一个开源的、基于内存的高性能键值数据库(key-valuestore)。它不仅支持简单的键值对,还支持多种复杂的数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(SortedSet)等。Redis常被用作缓存、中间件......
  • hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致
    如题https://github.com/sergezhigunov/Hangfire.EntityFrameworkCore/issues/32publicclassWorker:IBackgroundProcess{publicvoidExecute(BackgroundProcessContextcontext){using(varfetchedJob=connection.FetchNextJob(_queues.ToArray(),context.......