/// <summary> /// 执行 /// </summary> /// <param name="cancellationToken">取消令牌</param> public void Execute(CancellationToken cancellationToken) { using (var connection = (RedisConnection)_storage.GetConnection()) { var queues = connection.RedisClient.SMembers(_storage.GetRedisKey("queues")); foreach (var queue in queues) { ProcessQueue(queue, connection); } } cancellationToken.WaitHandle.WaitOne(_options.SleepTimeout); }
/// <summary> /// 执行 /// </summary> /// <param name="cancellationToken">取消令牌</param> public void Execute(CancellationToken cancellationToken) { using (var connection = (RedisConnection)_storage.GetConnection()) { var redis = connection.RedisClient; foreach (var key in ProcessedKeys) { var redisKey = _storage.GetRedisKey(key); var count = redis.LLen(redisKey); if (count == 0) { continue; } Logger.InfoFormat("Removing expired records from the '{0}' list...", key); const int batchSize = 100; var keysToRemove = new List <string>(); for (var last = count - 1; last >= 0; last -= batchSize) { var first = Math.Max(0, last - batchSize + 1); var jobIds = redis.LRange(redisKey, first, last); if (jobIds.Length == 0) { continue; } var tasks = new Task[jobIds.Length]; for (var i = 0; i < jobIds.Length; i++) { tasks[i] = redis.ExistsAsync(_storage.GetRedisKey($"job:{jobIds[i]}")); } Task.WaitAll(tasks); keysToRemove.AddRange(jobIds.Where((t, i) => !((Task <bool>)tasks[i]).Result)); } if (keysToRemove.Count == 0) { continue; } Logger.InfoFormat("Removing {0} expired jobs from '{1}' list...", keysToRemove.Count, key); using (var transaction = connection.CreateWriteTransaction()) { foreach (var jobId in keysToRemove) { transaction.RemoveFromList(key, jobId); } transaction.Commit(); } } } cancellationToken.WaitHandle.WaitOne(_checkInterval); }