- 添加[DisallowConcurrentExecution]屬性
- 執行方法時,添加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); } }