Exemplo n.º 1
0
 /// <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);
 }
Exemplo n.º 2
0
        /// <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);
        }