天天看點

Asp.netcore使用Hangfire來配置任務管理器

1. 下載下傳并引用NuGet元件包

     Hangfire.AspNetCore 【1.7.1】版本

     Hangfire.Dashboard.BasicAuthorization

     Hangfire.Mongo // 下面寫法适應于Hangfire.Mongo 的【 0.5.15】版本  我這裡使用的是Mongo資料庫,是以下載下傳這個 ,别的資料庫有别的對應的版本

2. 修改Startup裡面的 ConfigureServices

    添加HangFire配置

//配置定時任務管理器
services.AddHangfire(x => x.UseStorage(new MongoStorage(MongoClientSettings.FromConnectionString(Configuration["MongoContext:ConnectionString"]), Configuration["MongoContext:Database"]
               , new MongoStorageOptions
{
                   QueuePollInterval = TimeSpan.FromSeconds(15),             //- 作業隊列輪詢間隔。預設值為15秒。
                   JobExpirationCheckInterval = TimeSpan.FromHours(1),       //- 作業到期檢查間隔(管理過期記錄)。預設值為1小時。
                   CountersAggregateInterval = TimeSpan.FromMinutes(5),      //- 聚合計數器的間隔。預設為5分鐘。
                   Prefix = "Hangfire"                                  //- 資料庫中表的字首。預設為none
})));
           

 修改Startup裡面的Configure

 添加HangFire配置

//配置hangfire通路路徑
app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new[]
    {
        new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
            {
                SslRedirect = false,          // 是否将所有非SSL請求重定向到SSL URL
                RequireSsl = false,           // 需要SSL連接配接才能通路HangFire Dahsboard。強烈建議在使用基本身份驗證時使用SSL
                LoginCaseSensitive = false,   //登入檢查是否區分大小寫
                Users = new[]                 //配置登陸賬号和密碼
                {
                    new BasicAuthAuthorizationUser
                    {
                        Login ="admin",//使用者名
                        PasswordClear="123456"
                    }
                }
            })
    }
});
           

3.如上所示,HangFire已經配置完成。打開http://localhost:5001/hangfire即可進入hangfire頁面,如下

Asp.netcore使用Hangfire來配置任務管理器

輸入賬号密碼後,即可進入到任務管理器 界面。

Asp.netcore使用Hangfire來配置任務管理器

4. 建立任務的方法的分享:

using Hangfire;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace Jobs
{
    /// <summary>
    /// 周期性内容的Cron生成器
    /// </summary>
    public static class CycleCronType
    {
        /// <summary>
        /// 建立/更新名稱為workName周期性為分鐘的任務
        /// </summary>
        /// <param name="interval">執行周期的間隔,預設為每分鐘一次</param>
        /// <returns></returns>
        public static string Minute(int interval = 1)
        {
            return "1 0/" + interval.ToString() + " * * * ? ";
        }

        /// <summary>
        /// 建立/更新名稱為workName周期性為小時的任務
        /// </summary>
        /// <param name="minute">第幾分鐘開始,預設為第一分鐘</param>
        /// <param name="interval">執行周期的間隔,預設為每小時一次</param>
        /// <returns></returns>
        public static string Hour(int minute=1, int interval = 1)
        {
            return "1 " + minute + " 0/" + interval.ToString() + " * * ? ";
        }

        /// <summary>
        /// 建立/更新名稱為workName周期性為天的任務
        /// </summary>
        /// <param name="hour">第幾小時開始,預設從1點開始</param>
        /// <param name="minute">第幾分鐘開始,預設從第1分鐘開始</param>
        /// <param name="interval">執行周期的間隔,預設為每天一次</param>
        /// <returns></returns>
        public static string Day(int hour=1,int minute=1, int interval = 1)
        {
            return "1 "+minute.ToString()+" "+hour.ToString()+" 1/"+interval.ToString()+" * ? ";
        }

        /// <summary>
        /// 建立/更新名稱為workName周期性為周的任務
        /// </summary>
        /// <param name="dayOfWeek">星期幾開始,預設從星期一點開始</param>
        /// <param name="hour">第幾小時開始,預設從1點開始</param>
        /// <param name="minute">第幾分鐘開始,預設從第1分鐘開始</param>
        /// <returns></returns>
        public static string Week(DayOfWeek dayOfWeek=DayOfWeek.Monday,int hour = 1, int minute = 1)
        {
            // "* " + minute.ToString() + " " + hour.ToString() + " 1/" + interval.ToString() + " * ? *";
            return Cron.Weekly(dayOfWeek, hour, minute);
        }

        /// <summary>
        /// 建立/更新名稱為workName周期性為月的任務
        /// </summary>
        /// <param name="day">幾号開始,預設從一号開始</param>
        /// <param name="hour">第幾小時開始,預設從1點開始</param>
        /// <param name="minute">第幾分鐘開始,預設從第1分鐘開始</param>
        /// <returns></returns>
        public static string Month(int day=1, int hour = 1, int minute = 1)
        {
            // "* " + minute.ToString() + " " + hour.ToString() + " 1/" + interval.ToString() + " * ? *";
            return Cron.Monthly(day, hour, minute);
        }

        /// <summary>
        /// 建立/更新名稱為workName周期性為年的任務
        /// </summary>
        /// <param name="month">幾月開始,預設從一月開始</param>
        /// <param name="day">幾号開始,預設從一号開始</param>
        /// <param name="hour">第幾小時開始,預設從1點開始</param>
        /// <param name="minute">第幾分鐘開始,預設從第1分鐘開始</param>
        /// <returns></returns>
        public static string Year(int month=1,int day = 1, int hour = 1, int minute = 1)
        {
            // "* " + minute.ToString() + " " + hour.ToString() + " 1/" + interval.ToString() + " * ? *";
            return Cron.Yearly(month, day, hour, minute);
        }

    }

    /// <summary>
    /// 周期性任務
    /// 猴子 2019-04-18
    /// </summary>
    public static class CycleJob
    {
        // <summary>
        /// 建立/更新名稱為workName,周期性為cronType的任務
        ///</summary>
        public static void AddOrUpdate(string workName, Expression<Func<Task>> expression,string cronType)
        {
            RecurringJob.AddOrUpdate(workName, expression, cronType, TimeZoneInfo.Local);
        }

        // <summary>
        /// 建立/更新名稱為workName,周期性為cronType的任務
        ///</summary>
        public static void AddOrUpdate(string workName, Expression<Action> expression, string cronType)
        {
            RecurringJob.AddOrUpdate(workName, expression, cronType, TimeZoneInfo.Local);
        }

    }

    /// <summary>
    /// 延遲性任務
    /// 猴子 2019-04-18
    /// </summary>
    public static class DelayedJob
    {
        /// <summary>
        /// 建立延遲任務
        /// </summary>
        /// <param name="expression">執行的函數</param>
        /// <param name="minute">延遲的分鐘數</param>
        public static void AddOrUpdate(Expression<Func<Task>> expression,int minute)
        {
            BackgroundJob.Schedule(expression, TimeSpan.FromMinutes(minute));
        }


        /// <summary>
        /// 建立延遲任務
        /// </summary>
        /// <param name="expression">執行的函數</param>
        /// <param name="minute">延遲的分鐘數</param>
        public static void AddOrUpdate(Expression<Action> expression, int minute)
        {
            BackgroundJob.Schedule(expression, TimeSpan.FromMinutes(minute));
        }

    }

    /// <summary>
    /// 隊列任務
    /// 猴子 2019-04-18
    /// </summary>
    public static class QueueJob
    {
        /// <summary>
        /// 建立隊列任務
        /// </summary>
        /// <param name="expression">執行的函數</param>
        public static void AddOrUpdate(Expression<Func<Task>> expression)
        {
            BackgroundJob.Enqueue(expression);
        }

        /// <summary>
        /// 建立隊列任務
        /// </summary>
        /// <param name="expression">執行的函數</param>
        public static void AddOrUpdate(Expression<Action> expression)
        {
            BackgroundJob.Enqueue(expression);
        }

    }
    
}
           

繼續閱讀