Пример #1
0
        /// <summary>
        /// See IQueueService.
        /// </summary>
        public void Enqueue(QueueMessage message)
        {
            try
            {
                message.Id = Guid.NewGuid();
                this.manager.Get(message.QueueName).Enqueue(message);
            }
            catch (FaultException<QueueErrorInfo>)
            {
                throw;
            }
            catch (Exception ex)
            {
                ErrorLogger.Log(ex);

                var errorInfo = QueueErrorInfo.FromErrorCode(QueueErrorCode.CannotEnqueue);
                errorInfo.QueueMessage = message;

                throw new FaultException<QueueErrorInfo>(errorInfo);
            }
        }
Пример #2
0
        private void MoveToTransit(QueueMessage message)
        {
            var fileName = string.Format("{0}.qm", message.Id);
            var sourceFile = Path.Combine(this.persistLocation, fileName);
            var targetFile = Path.Combine(this.transitLocation, fileName);

            File.Move(sourceFile, targetFile);
        }
Пример #3
0
 private void Persist(QueueMessage message)
 {
     var file = Path.Combine(this.persistLocation, string.Format("{0}.qm", message.Id));
     using (var fs = File.OpenWrite(file))
     {
         formatter.Serialize(fs, message);
         fs.Flush();
     }
 }
Пример #4
0
        public void Enqueue(QueueMessage message)
        {
            var messageCopy = message;
            var messageType = messageCopy.Type;

            var queueExists = false;
            this.queueMap.ExecuteWithinReadLock(value => queueExists = value.ContainsKey(messageType));

            if (!queueExists)
            {
                this.queueMap.ExecuteWithinWriteLock(value =>
                {
                    if (value.ContainsKey(message.Type)) return;

                    value[message.Type] = new ConcurrentQueue<QueueMessage>();
                });
            }

            this.queueMap.ExecuteWithinReadLock(value =>
            {
                value[messageCopy.Type].Enqueue(messageCopy);
                if (this.queueInfo.IsPersisted) this.Persist(messageCopy);
            });
        }