2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > .Net Core环境搭建Hangfire项目

.Net Core环境搭建Hangfire项目

时间:2024-03-07 09:41:53

相关推荐

.Net Core环境搭建Hangfire项目

第一次搭建.Net Core环境的Hnagfire项目,记录下自己的经验,有问题望大家多多指点。

一.创建项目,添加引用

1.新建.Net Core Web应用程序,选择Web应用程序

2.添加项目引用。

因本人使用的数据库为SQL Server,故引用NuGet包为 Hangfire.Sqlserver。若为MySql,则引用包为Hangfire.MySql.Core。

具体引用如下:

Hangfire.AspNetCore --Hangfire的组件的包

Hangfire.MySql.Core / Hangfire.Sqlserver --Hangfire的持久化数据库的包

–权限包分为2种 任选其一 依赖项不同请自行选择

Hangfire.Dashboard.Authorization --Hangfire的权限控制包 (依赖项是owin和hangfire.Core) (目前没找到可视化界面的方法)

Hangfire.Dashboard.BasicAuthorization --Hangfire被人二次封装的包。支持可视化界面的植入。支持core等

二、添加相关代码配置。

1.因hangfire的任务需要数据库持久化,我们在Startup类中修改ConfigureServices,简单配置如下:

var connection = Configuration["ConnectionsStrings"];//数据库链接配置services.AddHangfire(x => x.UseSqlServerStorage(connection));

如果需要配置详细信息,则配置如下:

//hangfire的任务需要数据库持久化//Hangfire.AspNetCore//Hangfire.MySql.Core mysql引用 大小写敏感//Hangfire.SqlServer sqlserver引用 大小写敏感//hangfire必须需要绑定一个持久化的连接数据。 官方推荐的是sqlserver,还有mg,mssql,pgsql,redis都是个人封装的//连接字符串必须加 Allow User Variables=trueservices.AddHangfire(x => x.UseStorage(new SqlServerStorage(Configuration["ConnectionString"],new SqlServerStorageOptions{TransactionIsolationLevel = IsolationLevel.ReadCommitted, // 事务隔离级别。默认是读取已提交。QueuePollInterval = TimeSpan.FromSeconds(15), //- 作业队列轮询间隔。默认值为15秒。JobExpirationCheckInterval = TimeSpan.FromHours(1), //- 作业到期检查间隔(管理过期记录)。默认值为1小时。CountersAggregateInterval = TimeSpan.FromMinutes(5),//- 聚合计数器的间隔。默认为5分钟。PrepareSchemaIfNecessary = true,//- 如果设置为true,则创建数据库表。默认是true。DashboardJobListLimit = 50000, //- 仪表板作业列表限制。默认值为50000。TransactionTimeout = TimeSpan.FromMinutes(1), //- 交易超时。默认为1分钟。})));

以上为SqlServer相关配置,MySql类型,区别为相关名称修改为MySql,如:SqlServerStorage→MySqlStorage,

SqlServerStorageOptions→MySqlStorageOptions

2.自定义配置hangfire面板 (在Startup.cs 的Configure)

简单引用如下:

app.UseHangfireDashboard(); //使用hangfire面板app.UseHangfireServer();//启动hangfire服务

若需要配置其详细信息,则配置如下:

原生的面板如果不指定路径。默认的进入面板的地址是 (端口号:/hangfire),支持自定义进入hangfire的路径

Hangfire.Dashboard.Authorization 包的自定义方法 (方法1):

//添加面板的打开权限。不是所有人都可以打开面板。可以操作后台任务。app.UseHangfireDashboard("", new DashboardOptions{//方法1Authorization = new[]{new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{SslRedirect = false,// 是否将所有非SSL请求重定向到SSL URLRequireSsl = false, // 需要SSL连接才能访问HangFire Dahsboard。强烈建议在使用基本身份验证时使用SSLLoginCaseSensitive = false, //登录检查是否区分大小写Users = new[]{new BasicAuthAuthorizationUser{Login ="ycz",//用户名PasswordClear="123456"// Password as SHA1 hash//Password=new byte[]{ 0xf3,0xfa,,0xd1 }}}})},});

方法2:

//添加面板的打开权限。不是所有人都可以打开面板。可以操作后台任务。app.UseHangfireDashboard("", new DashboardOptions{//方法2Authorization = new[]{new HangfireAuthorizationFilter(){}},});

方法2启用的自定义规则类 。需要重写 IDashboardAuthorizationFilter 的 Authorize 方法

//默认是只能内网访问。 需要重写这个方法。注入规则public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter{//这里写自定义规则public bool Authorize([NotNull] DashboardContext context){if (context.Request.LocalIpAddress.Equals("127.0.0.1") || context.Request.LocalIpAddress.Equals("::1"))return true;elsereturn false;}}

方法 1 是支持可视化界面的。 方法 2没有可视化界面但是开放了接口 IDashboardAuthorizationFilter 可以重写自定义规则

方法 1 和 方法 2 引用的包不一样,不可同时使用两种方法。需要注意

Hangfire.Dashboard.BasicAuthorization (方法1的包)

Hangfire.Dashboard.Authorization (方法2的包)

方法 1 和 方法 2 根据自己的需求。自行选择。

方法1 可视化界面 输入正确进入仪表盘。 输入错误会刷新界面 继续在当前登录页。

方法2 拦截器验证 通过验证直接进入仪表盘。 没通过验证返回 401

3.自定义配置hangfire服务

//配置要处理的队列列表 ,如果多个服务器同时连接到数据库,会认为是分布式的一份子。可以通过这个配置根据服务器性能的按比例分配请求,不会导致服务器的压力。不配置则平分请求var jobOptions = new BackgroundJobServerOptions{Queues = new[] { "test", "default" },//队列名称,只能为小写WorkerCount = Environment.ProcessorCount * 5, //并发任务数 --超出并发数。将等待之前任务的完成 (推荐并发线程是cpu 的 5倍)ServerName = "hangfire1",//服务器名称};app.UseHangfireServer(jobOptions); //启动hangfire服务

angfire的服务是可以自定义任务的分发的。因为框架是支持分布式,可以根据任务量根据服务器的性能选择性的根据优劣比重进行分配任务,不然默认是平分任务。

三、配置完成。

起服务。 ip:端口号/hangfire (没自定义面板配置是hangfire,不然是自己定义的路由)进入可视化面板

同时你的数据库里会创建11张表持久化你的任务

四、任务部署。

在Startup.cs 的Configure部署其相关任务,代码如下

RecurringJob.AddOrUpdate(() => Console.WriteLine($" Core Hangfire"), Cron.Minutely(),TimeZoneInfo.Local);

Console.WriteLine($“ Core Hangfire”):代表需要执行的事件,可以自定义为个人方法

Cron.Minutely():代表每分钟执行一次,执行时间

TimeZoneInfo.Local:可以不添加,不填写则默认为UTC时间,添加表示按照北京时间

部署后页面如下

代码如图:

大致的使用如下,如果有什么不对的请大家多多指教。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。