编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Hangfire之Mysql 版本(mysql版本大全)

wxchong 2024-07-05 01:52:19 开源技术 15 ℃ 0 评论

上一篇已讲到:Hangfire之Mssql版本,今天说说下篇Mysql版

首先需要引用包:

先在appsettings.json配置文件中加入节点:

  "HangFire": {
      "DbConnection": "server=127.0.0.1;port=3306;database=hangfire;user=root;password=123;AllowUserVariables=True;",
       "LoginPath": "/services/index",  //服务平台地址
       "User": "admin",  //用户名 
       "Pwd": "123456"  //密码
  },

在Program.cs文件中注入服务:

//注入Hangfire服务
builder.Services.AddHangfireSetup();

//防止中文乱码 
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");

//注入Job
app.UseHangfireMiddleware();

注入时实现需实现中间类:AddHangfireSetup 和 UseHangfireMiddleware

  /// <summary>
    /// 注入hangfire,并配置是否初始化数据库
    /// </summary>
    public static class HangfireSetup
    {
        public static void AddHangfireSetup(this IServiceCollection services)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));
            if (services == null) throw new ArgumentNullException(nameof(services));
            string dbConnection = AppSettings.GetSection("HangFire:DbConnection");
            services.AddHangfire(configuration => configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)//此方法 只初次创建数据库使用即可
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseStorage(new MySqlStorage(dbConnection, new MySqlStorageOptions
                {
                    TransactionIsolationLevel =
                        (IsolationLevel?)System.Data.IsolationLevel.ReadCommitted, //事务隔离级别。默认是读取已提交
                    QueuePollInterval = TimeSpan.FromSeconds(15), //- 作业队列轮询间隔。默认值为15秒。
                    JobExpirationCheckInterval = TimeSpan.FromHours(1),
                    CountersAggregateInterval = TimeSpan.FromMinutes(5),
                    PrepareSchemaIfNecessary = false, // 如果设置为true,则创建数据库表,需要提前手动创建库。默认是true
                    DashboardJobListLimit = 50000,
                    TransactionTimeout = TimeSpan.FromMinutes(1),
                    TablesPrefix = "Hangfire"
                })));
            services.AddHangfireServer();
        }
    }
/// <summary>
 /// 配置面板以及注入job
 /// </summary> 
public static class HangfireMiddleware
    {
        public static void UseHangfireMiddleware(this IApplicationBuilder app)
        {
            if (app == null) throw new ArgumentNullException(nameof(app));
            //配置服务
            app.UseHangfireServer(ConfigureOptions()); 
            //配置面板   
            app.UseHangfireDashboard(AppSettings.GetSection("HangFire:LoginPath"), Authorization()); 
            //初始化Interval
            IntervalService.Create(app.ApplicationServices);
        }

        /// <summary>
        ///     配置账号模板信息
        /// </summary>
        /// <returns></returns>
        public static DashboardOptions Authorization()
        {
            var filter = new BasicAuthAuthorizationFilter(
                new BasicAuthAuthorizationFilterOptions
                {
                    SslRedirect = false,
                    RequireSsl = false,
                    LoginCaseSensitive = false,
                    Users = new[]
                    {
                        new BasicAuthAuthorizationUser
                        {
                            Login = AppSettings.GetSection("HangFire:User"), 
                            PasswordClear = AppSettings.GetSection("HangFire:Pwd") 
                        }
                    }
                });
            return new DashboardOptions
            {
                Authorization = new[] { filter }
            };
        }

        /// <summary>
        /// 配置
        /// </summary>
        /// <returns></returns>
        public static BackgroundJobServerOptions ConfigureOptions()
        {
            return new()
            {
                WorkerCount = Environment.ProcessorCount * 5, //并发任务
                ServerName = "定时调度服务" //代表服务名称
            };
        }
    }

其中的:

AppSettings 是读取配置文件的公共基类

IntervalService 是初始化主线程基类,之前mssql篇也介绍过

public class IntervalService
    {
        /// <summary>
        /// 初始化任务创建
        /// </summary>
        /// <param name="provider"></param>
        public static void Create(IServiceProvider provider)
        {
            IntervalService service = (IntervalService)FormatterServices.GetUninitializedObject(typeof(IntervalService));
            service.Start();
        }
        /// <summary>
        /// 主线程服务
        /// </summary>
        public void Start()
        {
            #region 每天凌晨五点执行
            RecurringJob.AddOrUpdate("xxx服务", () => 实现方法, "0 0 5 * * ?", TimeZoneInfo.Local);
            #endregion
        }
    }

时间配置规则为corn表达式,在Hangfire之Mssql版本此文中已经介绍,需要的小伙伴自行查看。

AppSettings类的实现

/// <summary>
    /// appsettings.json配置节点
    /// </summary>
    public class AppSettings
    {
        public static IConfiguration configuration { get; set; }

        static AppSettings()
        {
            configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
            .Build();
        }
        /// <summary>
        /// 获取配置文件中的节点值
        /// </summary>
        /// <param name="sectionAndkeyName">如:AppSetting:xxx:xxx</param>
        /// <returns></returns>
        public static string GetSection(string sectionAndkeyName)
        {
            return configuration[#34;{sectionAndkeyName}"];
        }
    }

至此调度服务就搭好了,可以运行看看效果,进入路径为:/services/hangfire,请注意避坑时区问题。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表