Example #1
0
        /// <summary>
        /// Update Transaction Queue Semaphore
        /// </summary>
        /// <param name="transactionQueueSemaphore"></param>
        /// <returns></returns>
        public async Task UpdateTransactionQueueSemaphore(TransactionQueueSemaphore transactionQueueSemaphore)
        {
            await Task.Delay(0);

            DateTime dateUpdated = DateTime.UtcNow;

            transactionQueueSemaphore.DateUpdated = dateUpdated;
        }
        /// <summary>
        /// Create Transaction Queue Semaphore
        /// </summary>
        /// <param name="transactionQueueSemaphore"></param>
        /// <returns></returns>
        public async Task CreateTransactionQueueSemaphore(TransactionQueueSemaphore transactionQueueSemaphore)
        {
            DateTime dateCreated = DateTime.UtcNow;

            transactionQueueSemaphore.DateCreated = dateCreated;
            transactionQueueSemaphore.DateUpdated = dateCreated;

            await dbConnection.TransactionQueueSemaphores.AddAsync(transactionQueueSemaphore);
        }
Example #3
0
        /// <summary>
        /// Get Transaction Queue Semaphore
        /// </summary>
        /// <param name="semaphoreKey"></param>
        /// <returns></returns>
        public async Task <TransactionQueueSemaphore> GetTransactionQueueSemaphore(string semaphoreKey)
        {
            StringBuilder sqlBuilder = new StringBuilder();

            sqlBuilder.AppendLine(" SELECT * FROM TransactionQueueSemaphores WITH (UPDLOCK) WHERE ");
            sqlBuilder.AppendLine(" SemaphoreKey = @SemaphoreKey ");

            string sqlStatement = sqlBuilder.ToString();

            SqlParameter semaphoreKeyParameter = new SqlParameter("SemaphoreKey", semaphoreKey);

            TransactionQueueSemaphore transactionQueue = await dbConnection.TransactionQueueSemaphores.FromSqlRaw(sqlStatement, semaphoreKeyParameter).FirstOrDefaultAsync();

            return(transactionQueue);
        }
Example #4
0
        /// <summary>
        /// Process Messages
        /// </summary>
        /// <returns></returns>
        public async Task <ResponseModel <List <MessageQueue> > > ProcessMessages(string inboundSemaphoreKey, ConnectionStrings connectionStrings)
        {
            ResponseModel <List <MessageQueue> > returnResponse = new ResponseModel <List <MessageQueue> >();

            returnResponse.Entity = new List <MessageQueue>();

            TransactionQueueSemaphore transactionQueueSemaphore = null;

            lock (_processingLock)
            {
                if (_processing == true)
                {
                    Console.WriteLine("Processing iteration aborted");
                    return(returnResponse);
                }

                _processing = true;
            }

            try
            {
                _inventoryManagementDataService.OpenConnection(connectionStrings.PrimaryDatabaseConnectionString);

                _inventoryManagementDataService.BeginTransaction((int)IsolationLevel.Serializable);

                Console.WriteLine("Get Lock at " + DateTime.Now.ToString());
                transactionQueueSemaphore = await _inventoryManagementDataService.GetTransactionQueueSemaphore(inboundSemaphoreKey);

                if (transactionQueueSemaphore == null)
                {
                    transactionQueueSemaphore = new TransactionQueueSemaphore();
                    transactionQueueSemaphore.SemaphoreKey = inboundSemaphoreKey;
                    await _inventoryManagementDataService.CreateTransactionQueueSemaphore(transactionQueueSemaphore);
                }
                else
                {
                    await _inventoryManagementDataService.UpdateTransactionQueueSemaphore(transactionQueueSemaphore);
                }

                List <TransactionQueueInbound> transactionQueue = await _inventoryManagementDataService.GetInboundTransactionQueue();

                foreach (TransactionQueueInbound transactionQueueItem in transactionQueue)
                {
                    int    senderId        = transactionQueueItem.SenderTransactionQueueId;
                    string exchangeName    = transactionQueueItem.ExchangeName;
                    string transactionCode = transactionQueueItem.TransactionCode;

                    TransactionQueueInboundHistory transactionHistory = await _inventoryManagementDataService.GetInboundTransactionQueueHistoryBySender(senderId, exchangeName);

                    if (transactionHistory != null)
                    {
                        await LogDuplicateMessage(transactionQueueItem);

                        await _inventoryManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId);
                    }
                    else if (transactionCode == TransactionQueueTypes.PurchaseOrderSubmitted)
                    {
                        await PurchaseOrderSubmitted(transactionQueueItem);

                        await _inventoryManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId);
                    }
                    else if (transactionCode == TransactionQueueTypes.SalesOrderSubmitted)
                    {
                        await SalesOrderSubmitted(transactionQueueItem);

                        await _inventoryManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId);
                    }
                    else if (transactionCode == TransactionQueueTypes.Acknowledgement)
                    {
                        await ProcessAcknowledgement(transactionQueueItem);

                        await _inventoryManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId);
                    }
                }

                await _inventoryManagementDataService.UpdateDatabase();

                _inventoryManagementDataService.CommitTransaction();

                _inventoryManagementDataService.CloseConnection();
            }
            catch (Exception ex)
            {
                _inventoryManagementDataService.RollbackTransaction();
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
            }
            finally
            {
                _inventoryManagementDataService.CloseConnection();
                _processing = false;
            }

            return(returnResponse);
        }
Example #5
0
        /// <summary>
        /// Get Messages To Send
        /// </summary>
        /// <param name="messageQueueConfigurations"></param>
        /// <param name="outboundSemaphoreKey"></param>
        /// <param name="connectionStrings"></param>
        /// <returns></returns>
        private async Task <ResponseModel <List <MessageQueue> > > GetMessagesToSend(List <IMessageQueueConfiguration> messageQueueConfigurations, string outboundSemaphoreKey, ConnectionStrings connectionStrings)
        {
            TransactionQueueSemaphore transactionQueueSemaphore = null;

            ResponseModel <List <MessageQueue> > returnResponse = new ResponseModel <List <MessageQueue> >();

            returnResponse.Entity = new List <MessageQueue>();

            try
            {
                _inventoryManagementDataService.OpenConnection(connectionStrings.PrimaryDatabaseConnectionString);
                _inventoryManagementDataService.BeginTransaction((int)IsolationLevel.Serializable);

                transactionQueueSemaphore = await _inventoryManagementDataService.GetTransactionQueueSemaphore(outboundSemaphoreKey);

                if (transactionQueueSemaphore == null)
                {
                    transactionQueueSemaphore = new TransactionQueueSemaphore();
                    transactionQueueSemaphore.SemaphoreKey = outboundSemaphoreKey;
                    await _inventoryManagementDataService.CreateTransactionQueueSemaphore(transactionQueueSemaphore);
                }
                else
                {
                    await _inventoryManagementDataService.UpdateTransactionQueueSemaphore(transactionQueueSemaphore);
                }

                List <TransactionQueueOutbound> transactionQueue = await _inventoryManagementDataService.GetOutboundTransactionQueue();

                foreach (TransactionQueueOutbound transactionQueueItem in transactionQueue)
                {
                    MessageQueue message = new MessageQueue();
                    message.ExchangeName       = transactionQueueItem.ExchangeName;
                    message.TransactionQueueId = transactionQueueItem.TransactionQueueOutboundId;
                    message.TransactionCode    = transactionQueueItem.TransactionCode;
                    message.Payload            = transactionQueueItem.Payload;

                    IMessageQueueConfiguration messageQueueConfiguration = messageQueueConfigurations.Where(x => x.TransactionCode == message.TransactionCode).FirstOrDefault();
                    if (messageQueueConfiguration == null)
                    {
                        break;
                    }

                    ResponseModel <MessageQueue> messageQueueResponse = messageQueueConfiguration.SendMessage(message);
                    if (messageQueueResponse.ReturnStatus == true)
                    {
                        transactionQueueItem.SentToExchange     = true;
                        transactionQueueItem.DateSentToExchange = DateTime.UtcNow;
                        await _inventoryManagementDataService.UpdateOutboundTransactionQueue(transactionQueueItem);

                        returnResponse.Entity.Add(message);
                    }
                    else
                    {
                        break;
                    }
                }

                await _inventoryManagementDataService.UpdateDatabase();

                _inventoryManagementDataService.CommitTransaction();
                _inventoryManagementDataService.CloseConnection();
            }
            catch (Exception ex)
            {
                _inventoryManagementDataService.RollbackTransaction();
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
            }
            finally
            {
                _inventoryManagementDataService.CloseConnection();
            }

            return(returnResponse);
        }
Example #6
0
        /// <summary>
        /// Send Queue Messages
        /// </summary>
        /// <param name="messageQueueConfigurations"></param>
        /// <param name="outboundSemaphoreKey"></param>
        /// <param name="connectionStrings"></param>
        /// <returns></returns>
        public async Task <ResponseModel <List <MessageQueue> > > SendQueueMessages(List <IMessageQueueConfiguration> messageQueueConfigurations, string outboundSemaphoreKey, ConnectionStrings connectionStrings)

        {
            ResponseModel <List <MessageQueue> > returnResponse = new ResponseModel <List <MessageQueue> >();

            returnResponse.Entity = new List <MessageQueue>();

            lock (_sendingLock)
            {
                if (_sending)
                {
                    Console.WriteLine("Aborted iteration still sending");
                    return(returnResponse);
                }

                _sending = true;
            }

            TransactionQueueSemaphore transactionQueueSemaphore = null;

            try
            {
                _loggingManagementDataService.OpenConnection(connectionStrings.PrimaryDatabaseConnectionString);

                _loggingManagementDataService.BeginTransaction((int)IsolationLevel.Serializable);

                transactionQueueSemaphore = await _loggingManagementDataService.GetTransactionQueueSemaphore(outboundSemaphoreKey);

                if (transactionQueueSemaphore == null)
                {
                    transactionQueueSemaphore = new TransactionQueueSemaphore();
                    transactionQueueSemaphore.SemaphoreKey = outboundSemaphoreKey;
                    await _loggingManagementDataService.CreateTransactionQueueSemaphore(transactionQueueSemaphore);
                }
                else
                {
                    await _loggingManagementDataService.UpdateTransactionQueueSemaphore(transactionQueueSemaphore);
                }

                List <AcknowledgementsQueue> acknowledgementsQueue = await _loggingManagementDataService.ProcessAcknowledgementsQueue();

                foreach (AcknowledgementsQueue transactionQueueItem in acknowledgementsQueue)
                {
                    MessageQueue message = new MessageQueue();
                    message.ExchangeName       = transactionQueueItem.ExchangeName;
                    message.TransactionQueueId = transactionQueueItem.SenderTransactionQueueId;
                    message.TransactionCode    = TransactionQueueTypes.Acknowledgement;
                    message.QueueName          = transactionQueueItem.AcknowledgementQueue;

                    IMessageQueueConfiguration messageQueueConfiguration = messageQueueConfigurations.FirstOrDefault();
                    if (messageQueueConfiguration == null)
                    {
                        break;
                    }

                    ResponseModel <MessageQueue> messageQueueResponse = messageQueueConfiguration.SendAcknowledgementMessage(message);
                    if (messageQueueResponse.ReturnStatus == true)
                    {
                        await _loggingManagementDataService.DeleteAcknowledgementsQueue(transactionQueueItem.AcknowledgementsQueueId);

                        returnResponse.Entity.Add(message);
                    }
                }

                await _loggingManagementDataService.UpdateDatabase();

                _loggingManagementDataService.CommitTransaction();

                _loggingManagementDataService.CloseConnection();
            }
            catch (Exception ex)
            {
                _loggingManagementDataService.RollbackTransaction();
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
            }
            finally
            {
                _loggingManagementDataService.CloseConnection();
                _sending = false;
            }

            return(returnResponse);
        }