Beispiel #1
0
        private void ListenToRedisTopic()
        {
            var connection = RedisSchedulerContext.Current.Connection;

            while (true)
            {
                var lockToken = Guid.NewGuid();
                RedisResponseMessage responseMessage = null;
                RedisValue           value           = new RedisValue();
                try
                {
                    RedisSchedulerContext.Current.GetLock($"{RedisSchedulerContext.Current.ResponseQueue}.Lock", lockToken.ToString());
                    if (RedisSchedulerContext.Current.Connection.GetDatabase().ListLength(RedisSchedulerContext.Current.ResponseQueue) > 0)
                    {
                        value = RedisSchedulerContext.Current.Connection.GetDatabase().ListRightPop(RedisSchedulerContext.Current.ResponseQueue);
                    }
                }
                catch (Exception ex)
                {
                    NScrapyContext.CurrentContext.Log.Error($"Error getting value from Redis", ex);
                }
                finally
                {
                    RedisSchedulerContext.Current.ReleaseLock($"{RedisSchedulerContext.Current.ResponseQueue}.Lock", lockToken.ToString());
                }
                if (!value.HasValue)
                {
                    continue;
                }
                responseMessage = JsonConvert.DeserializeObject <RedisResponseMessage>(value);
                if (registedCallback.ContainsKey(responseMessage.CallbacksFingerprint))
                {
                    var callback = registedCallback[responseMessage.CallbacksFingerprint];
                    var response = NScrapyHelper.DecompressResponse(responseMessage.Payload);
                    var task     = new Task(() => callback(response));
                    task.ContinueWith(t => NScrapyContext.CurrentContext.Log.Error($"Error Process Callback {responseMessage.CallbacksFingerprint}", task.Exception), TaskContinuationOptions.OnlyOnFaulted);
                    task.Start();
                }
            }
        }