hangfire使用筆記


1、導入nuget包

2、配置

簡單配置后就可以寫自己的Job了

注意:Hangfire.RecurringJobExtensions這個擴展支持兩種job添加方法:json配置文件和特性。但由於時區使用的是string配置,導致Linux上時區不對,所以擴展一下job的加載方法:

如果不希望在一個job還沒執行完成的時候再次進入該job,添加如下過濾器:
/// <summary>
    /// 每個job都不可重入過濾器
    /// </summary>
    public class NotReentryServerHangfireFilter : IServerFilter
    {
        /// <summary>
        /// 判斷job是否正在運行
        /// </summary>
        static ConcurrentDictionary<string, DateTime> JobRunnings = new ConcurrentDictionary<string, DateTime>();

        ILogger _logger;
        public NotReentryServerHangfireFilter(ILogger<NotReentryServerHangfireFilter> logger)
        {
            _logger = logger;
        }

        public void OnPerforming(PerformingContext filterContext)
        {
            var jobId = BuildJobId(filterContext.BackgroundJob);
            if(!JobRunnings.TryAdd(jobId, DateTime.Now))
            {
                filterContext.Canceled = true;
                return;
            }
            _logger.LogInformation($"{jobId} starting...");
        }

        public void OnPerformed(PerformedContext filterContext)
        {
            var jobId = BuildJobId(filterContext.BackgroundJob);
            JobRunnings.TryRemove(jobId, out var tmp);
            _logger.LogInformation($"{jobId} finished.");
        }

        public string BuildJobId(BackgroundJob job)
        {
            return $"{job.Job.Type.FullName}.{job.Job.Method.Name}";
        }
    }
 dashboard的授權取決於你的自己的身份認證機制了: 
異常:
日志:
日志:
public class HangfireLoggerProvider : ILogProvider
    {
        ILoggerFactory _loggerFactory;
        public HangfireLoggerProvider(ILoggerFactory loggerFactory)
        {
            _loggerFactory = loggerFactory;
        }

        public ILog GetLogger(string name)
        {
            return new HangfireLogger(_loggerFactory.CreateLogger(name));
        }
    }

    public class HangfireLogger : ILog
    {
        ILogger _logger;

        public HangfireLogger(ILogger logger)
        {
            _logger = logger;
        }

        public bool Log(Hangfire.Logging.LogLevel logLevel, Func<string> messageFunc, Exception exception = null)
        {
            var msg = messageFunc?.Invoke();
            if (string.IsNullOrWhiteSpace(msg) && exception == null)
                return false;

            switch (logLevel)
            {
                case Hangfire.Logging.LogLevel.Trace:
                    _logger.LogTrace(0, exception, msg);
                    break;
                case Hangfire.Logging.LogLevel.Debug:
                    _logger.LogDebug(0, exception, msg);
                    break;
                case Hangfire.Logging.LogLevel.Info:
                    _logger.LogInformation(0, exception, msg);
                    break;
                case Hangfire.Logging.LogLevel.Warn:
                    _logger.LogWarning(0, exception, msg);
                    break;
                case Hangfire.Logging.LogLevel.Error:
                    _logger.LogError(0, exception, msg);
                    break;
                case Hangfire.Logging.LogLevel.Fatal:
                    _logger.LogCritical(0, exception, msg);
                    break;
                default:
                    break;
            }

            return true;
        }
    }

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM