void Create(IDbConnection connection, CreateMessage request) { connection.Insert(new QueueMessage { Content = request.Content, Readed = false }); if (!string.IsNullOrEmpty(request.Cooperator)) { Propagators.ScheduleQueueOperation(request.QueueName, () => PropagateRequest(request)); } }
void TryDelete(IDbConnection connection, DeleteMessage request) { var firstMessageInQueue = connection.FirstOrDefault(FirstMessageQuery.make(connection)); if (firstMessageInQueue == null || firstMessageInQueue.Id != request.MessageId) { throw new ArgumentException("Provided message was not first in queue"); } firstMessageInQueue.Readed = true; connection.Update(firstMessageInQueue); Propagators.ScheduleQueueOperation(request.QueueName, () => PropagateRequest(request)); }
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); }
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); } }
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)); } } }