/// <summary>
        ///  Create Inbound Transaction Queue History
        /// </summary>
        /// <param name="transactionQueue"></param>
        /// <returns></returns>
        public async Task CreateInboundTransactionQueueHistory(TransactionQueueInboundHistory transactionQueue)
        {
            DateTime dateCreated = DateTime.UtcNow;

            transactionQueue.DateCreated = dateCreated;

            await dbConnection.TransactionQueueInboundHistory.AddAsync(transactionQueue);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Log Successfully Processed
        /// </summary>
        /// <param name="transaction"></param>
        /// <returns></returns>
        private async Task LogSuccessfullyProcessed(TransactionQueueInbound transaction)
        {
            TransactionQueueInboundHistory transactionHistory = new TransactionQueueInboundHistory();

            transactionHistory.TransactionQueueInboundId = transaction.TransactionQueueInboundId;
            transactionHistory.SenderTransactionQueueId  = transaction.SenderTransactionQueueId;
            transactionHistory.TransactionCode           = transaction.TransactionCode;
            transactionHistory.Payload               = transaction.Payload;
            transactionHistory.ExchangeName          = transaction.ExchangeName;
            transactionHistory.ProcessedSuccessfully = true;
            transactionHistory.DuplicateMessage      = false;
            transactionHistory.ErrorMessage          = string.Empty;
            transactionHistory.DateCreatedInbound    = transaction.DateCreated;

            await _inventoryManagementDataService.CreateInboundTransactionQueueHistory(transactionHistory);
        }
        /// <summary>
        ///  Log Duplicate Message
        /// </summary>
        /// <param name="transactionQueueItem"></param>
        /// <returns></returns>
        private async Task LogDuplicateMessage(TransactionQueueInbound transactionQueueItem)
        {
            // log history as duplicate
            TransactionQueueInboundHistory transactionHistory = new TransactionQueueInboundHistory();

            transactionHistory.TransactionQueueInboundId = transactionQueueItem.TransactionQueueInboundId;
            transactionHistory.SenderTransactionQueueId  = transactionQueueItem.SenderTransactionQueueId;
            transactionHistory.TransactionCode           = transactionQueueItem.TransactionCode;
            transactionHistory.Payload               = transactionQueueItem.Payload;
            transactionHistory.ExchangeName          = transactionQueueItem.ExchangeName;
            transactionHistory.ProcessedSuccessfully = false;
            transactionHistory.DuplicateMessage      = true;
            transactionHistory.ErrorMessage          = string.Empty;
            transactionHistory.DateCreatedInbound    = transactionQueueItem.DateCreated;

            await _salesOrderManagementDataService.CreateInboundTransactionQueueHistory(transactionHistory);
        }
Ejemplo n.º 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);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Get Inbound Transaction Queue History By Sender
        /// </summary>
        /// <param name="senderTransactionQueueId"></param>
        /// <returns></returns>
        public async Task <TransactionQueueInboundHistory> GetInboundTransactionQueueHistoryBySender(int senderTransactionQueueId, string exchangeName)
        {
            TransactionQueueInboundHistory transactionQueue = await dbConnection.TransactionQueueInboundHistory.Where(x => x.ExchangeName == exchangeName && x.SenderTransactionQueueId == senderTransactionQueueId).FirstOrDefaultAsync();

            return(transactionQueue);
        }