示例#1
0
 public QueueMessage ReadNextFrom(string queueName)
 {
     using (var connection = Connections.ConnectToInitializedQueue(queueName))
     {
         return(ReadMessage(connection, Locks.TakeQueueLock(queueName)));
     }
 }
示例#2
0
        public void Report(QueueFailure request)
        {
            var recoveryAction = HandleFailure(new FailureDescriptor
            {
                PathToDbFile      = Connections.PathToDbFile(Connections.QueuesDir, request.Name),
                DbLock            = Locks.TakeQueueLock(request.Name),
                CooperatorAddress = request.Cooperator,
                RecoveryCategory  = "queues",
                DbName            = request.Name
            });

            Propagators.ScheduleQueueOperation(request.Name, recoveryAction);
        }
示例#3
0
        public void Delete(DeleteQueue request)
        {
            var queueLock = Locks.TakeQueueLock(request.QueueName);

            lock (queueLock)
            {
                if (Locks.QueuesRecoveryLocks.ContainsKey(request.QueueName))
                {
                    throw new Exception($"Queue {request.QueueName} is inconsistent");
                }

                Connections.RemoveQueue(request.QueueName);
                Monitor.PulseAll(queueLock);
                Propagators.ScheduleQueueOperation(request.QueueName, () => Propagate(request));
                Locks.RemoveQueueLock(request.QueueName);
            }
        }
示例#4
0
        public void Create(CreateMessage request)
        {
            var queueLock = Locks.TakeQueueLock(request.QueueName);

            lock (queueLock)
            {
                if (Locks.QueuesRecoveryLocks.ContainsKey(request.QueueName))
                {
                    throw new Exception($"Queue {request.QueueName} is inconsistent");
                }

                using (var connection = Connections.ConnectToInitializedQueue(request.QueueName))
                {
                    Create(connection, request);
                    Monitor.PulseAll(queueLock);
                }
            }
        }
示例#5
0
        public void Create(CreateQueue request)
        {
            var queueLock = Locks.TakeQueueLock(request.Name);

            lock (queueLock)
            {
                if (Locks.QueuesRecoveryLocks.ContainsKey(request.Name))
                {
                    throw new Exception($"Queue {request.Name} is inconsistent");
                }

                CreateQueueFile(request.Name);
                if (!string.IsNullOrEmpty(request.Cooperator))
                {
                    Propagators.ScheduleQueueOperation(request.Name, () => PropagateRequestToCo(request));
                }
            }
        }
示例#6
0
        public void Delete(DeleteMessage request)
        {
            var queueLock = Locks.TakeQueueLock(request.QueueName);

            lock (queueLock)
            {
                if (Locks.QueuesRecoveryLocks.ContainsKey(request.QueueName))
                {
                    throw new Exception($"Queue {request.QueueName} is inconsistent");
                }
                using (var connection = Connections.ConnectToInitializedQueue(request.QueueName))
                {
                    if (IsDeleteDecisionImposedByCooperator(request))
                    {
                        ForceDelete(connection, request);
                    }
                    else
                    {
                        TryDelete(connection, request);
                    }
                }
            }
        }