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

      

      

  • 相关阅读:
    VM VirtualBox安装Centos6.5
    桥接
    程序员工作心法
    策略模式-鸭子怎么飞-实例
    策略模式-用什么方式去上班呢 实例
    观察者模式-订报纸,语音呼叫系统实例
    门面(Facade)模式--医院,保安系统实例
    Promise实例的resolve方法
    Promise实例的any方法
    Promise实例的race方法
  • 原文地址:https://www.cnblogs.com/pangjianxin/p/8328169.html
Copyright © 2020-2023  润新知