使用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);
            }
        }
复制代码

 

posted @   低调码农哥!  阅读(1725)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示