ASP.NET Core集成 Hangfire

对于Hangfire你可以使用何类型的存储方式。最常用的一个方式是使用SQL Server 作为存储(请查询Hangfire.SqlServer)。在你安装完这些nuget包后,你可以配置你的项目来使用Hangfire。

首先,我们更改Startup类的 ConfigureServices 方法来添加Hangfire的依赖注入,并且配置存储方式以及连接字符串。

首先,我们更改Startup类的 ConfigureServices 方法来添加Hangfire的依赖注入,并且配置存储方式以及连接字符串。

services.AddHangfire(config =>
{
    config.UseSqlServerStorage(_appConfiguration.GetConnectionString("Default"));
});
 

然后我们可以在 Configure 方法中添加对UseHangfireServer的调用。

app.UseHangfireServer();
 

如果你想使用Hangfire的Dashboard,你也可这样做:

app.UseHangfireDashboard();
 

如果你想要授权认证dasboard,你可以像下面一样使用AbpHangfireAuthorizationFilter:

app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new[] { new AbpHangfireAuthorizationFilter("MyHangFireDashboardPermissionName") }
});
 #region Hangfire定时任务

            app.UseHangfireServer();
            //授权
            var filter = new BasicAuthAuthorizationFilter(
                new BasicAuthAuthorizationFilterOptions
                {
                    SslRedirect = false,
                    // Require secure connection for dashboard
                    RequireSsl = false,
                    // Case sensitive login checking
                    LoginCaseSensitive = false,
                    // Users
                    Users = new[]
                    {
                        new BasicAuthAuthorizationUser
                        {
                            Login = ConfigurationManager.AppSettings["HangFire"][0].ToString(),
                            PasswordClear = ConfigurationManager.AppSettings["HangFire"][1].ToString()
                        }
                    }
                });
            var options = new DashboardOptions
            {
                AppPath = "/",//返回时跳转的地址
                DisplayStorageConnectionString = false,//是否显示数据库连接信息
                Authorization = new[]
                                                      {
                                                            filter
                                                        },
                IsReadOnlyFunc = Context =>
                {
                    return false;//是否只读面板
                }
            };

            app.UseHangfireDashboard("/job", options); //可以改变Dashboard的url
            HangfireDispose.HangfireService();

            #endregion

上面的配置是集成hangfire到ASP.NET Core应用的标准配置。

WebUI.Core\WebService\HangfireDispose.cs

using System;
using System.ServiceModel;
using Elight.Logic.Sys;
using Elight.Utility.Logs;
using Hangfire;

namespace Elight.WebUI.Core.WebService
{
    [ServiceContract(Namespace = "http://test.namespace")]
    public class HangfireDispose
    {

        #region 配置服务

        public static void HangfireService()
        {
            LogLogic log = new LogLogic();
            //Fire - And - forget(发布 / 订阅)
            //这是一个主要的后台任务类型,持久化消息队列会去处理这个任务。当你创建了一个发布 / 订阅任务,该任务会被保存到默认队列里面(默认队列是"Default",但是支持使用多队列)。多个专注的工作者(Worker)会监听这个队列,并且从中获取任务并且完成任务。
            //BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
            //BackgroundJob.Enqueue(() => log.WriteSimple(Level.Info, "BackgroundJob", "Enqueue成功", "BackgroundJob.Enqueue", "Fire-and-forget"));

            


            //延迟
            //如果想要延迟某些任务的执行,可以是用以下任务。在给定延迟时间后,任务会被排入队列,并且和发布 / 订阅任务一样执行。
            //BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
            //BackgroundJob.Schedule(() => log.WriteSimple(Level.Info, "BackgroundJob", "Schedule成功", "BackgroundJob.Schedule", "如果想要延迟某些任务的执行"), TimeSpan.FromDays(1));
            
            //循环
            //按照周期性(小时,天等)来调用方法,请使用RecurringJob类。在复杂的场景,您可以使用CRON表达式指定计划时间来处理任务。
            //RecurringJob.AddOrUpdate(() => Console.WriteLine("Daily Job"), Cron.Daily);
            RecurringJob.AddOrUpdate(() => log.WriteSimple(Level.Info, "RecurringJob", "seconds成功", "Hello, seconds!", "每15秒执行一次"), "*/15 * * * * *");

            //连续
            //连续性允许您通过将多个后台任务链接在一起来定义复杂的工作流。
            //var id = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, "));
            //BackgroundJob.ContinueWith(id, () => Console.WriteLine("world!"));

            //var id = BackgroundJob.Enqueue(() => log.Write(Level.Info, "BackgroundJob", "BackgroundJob.ContinueWith成功", "Hello", "连续性允许您通过将多个后台任务"));
            //BackgroundJob.ContinueWith(id, () => log.Write(Level.Info, "BackgroundJob", "BackgroundJob.ContinueWith成功", "world!", "链接在一起来定义复杂的工作流"));


            //try
            //{
            //    _backgroundJobs.Enqueue<Services>(x => x.LongRunning(JobCancellationToken.Null));

            //    _recurringJobs.AddOrUpdate("seconds", () => Console.WriteLine("Hello, seconds!"), "*/15 * * * * *");
            //    _recurringJobs.AddOrUpdate("minutely", () => Console.WriteLine("Hello, world!"), Cron.Minutely);
            //    _recurringJobs.AddOrUpdate("hourly", () => Console.WriteLine("Hello"), "25 15 * * *");
            //    _recurringJobs.AddOrUpdate("neverfires", () => Console.WriteLine("Can only be triggered"), "0 0 31 2 *");

            //    _recurringJobs.AddOrUpdate("Hawaiian", () => Console.WriteLine("Hawaiian"), "15 08 * * *", TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"));
            //    _recurringJobs.AddOrUpdate("UTC", () => Console.WriteLine("UTC"), "15 18 * * *");
            //    _recurringJobs.AddOrUpdate("Russian", () => Console.WriteLine("Russian"), "15 21 * * *", TimeZoneInfo.Local);
            //}
            //catch (Exception e)
            //{
            //    _logger.LogError("An exception occurred while creating recurring jobs.", e);
            //}



            //这里呢就是需要触发的方法 "0/10 * * * * ? " 可以自行搜索cron表达式 代表循环的规律很简单
            //CancelOrderJob代表你要触发的类 Execute代表你要触发的方法




        }

        #endregion
    }
}

  

 

HangfireService

posted @ 2021-08-26 15:56  SkyDBA  阅读(657)  评论(0)    收藏  举报