使用Quartz每分鍾執行job,避免數據重復解決方案


  1. 添加[DisallowConcurrentExecution]屬性
  2. 執行方法時,添加Redis鎖

  參考如下:

/// <summary>
    /// 添加 DisallowConcurrentExecution屬性
    /// 一次只執行一個job,禁止多個job運行
    /// </summary>
    [DisallowConcurrentExecution]
    public class AutoPass : BaseJob
    {

        private readonly ILogger<AutoPass> _logger;
        public IDatabase _redisDb;
        private RedisOperate redisHelper;
        PostgreDbContext _postgreDbContext;
        public AutoPass(ILogger<AutoPass> logger, IDatabase database, PostgreDbContext postgreDbContext)
        {
            _logger = logger;
            _redisDb = database;
            redisHelper = new RedisOperate(_redisDb);
            _postgreDbContext = postgreDbContext;
        }

        public override Task ExecuteMethod(IJobExecutionContext context)
        {
            _logger.LogError($"AutoPass Execute start...");
            return Task.Run(() =>
            {
                //自動審核邏輯
                AutoCheck();
            });
        }

        /// <summary>
        ///自動審核邏輯
        /// </summary>
        private void AutoCheck()
        {
            List<string> statusLog = new List<string>();
            try
            {
                //redis 記錄
                if (!redisHelper.ActionExecuting("autoverified"))
                {
                    _logger.LogError($"{DateTime.Now}:AutoCheck 正在批量審核,請稍后再試");
                    return;
                }

                // 業務代碼********************
           
                
                //釋放 redis
                redisHelper.ActionExecuted("autoverified");
                _logger.LogError($"{DateTime.Now}:AutoCheck 釋放   redis key");
            }
            catch (Exception ex)
            {
                //釋放 redis
                redisHelper.ActionExecuted("autoverified");
                _logger.LogError($"Error,Message:{ex.Message},StackTrace:{ex.StackTrace}");
            }
        }
    }
 /// <summary>
        /// 請求開始記錄redis,並返回可否繼續執行  true:可繼續執行  false:不可繼續執行
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool ActionExecuting(string key)
        {
            var result = _redisDb.HashExistsAsync(key, true);
            if (!result.Result)
            {
                _redisDb.HashIncrementAsync(key, true);
                _redisDb.KeyExpireAsync(key, new TimeSpan(0, 0, 5, 0));
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 請求結算,刪除redis記錄
        /// </summary>
        /// <param name="key"></param>
        public void ActionExecuted(string key)
        {
            var result = _redisDb.HashExistsAsync(key, true);
            if (result.Result)
            {
                _redisDb.KeyDeleteAsync(key);
            }
        }

 


免責聲明!

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



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