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;
        }
    }

  

  

原文地址:https://www.cnblogs.com/pangjianxin/p/8328169.html