/// <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 { _purchaseOrderManagementDataService.OpenConnection(connectionStrings.PrimaryDatabaseConnectionString); _purchaseOrderManagementDataService.BeginTransaction((int)IsolationLevel.Serializable); transactionQueueSemaphore = await _purchaseOrderManagementDataService.GetTransactionQueueSemaphore(inboundSemaphoreKey); if (transactionQueueSemaphore == null) { transactionQueueSemaphore = new TransactionQueueSemaphore(); transactionQueueSemaphore.SemaphoreKey = inboundSemaphoreKey; await _purchaseOrderManagementDataService.CreateTransactionQueueSemaphore(transactionQueueSemaphore); } else { await _purchaseOrderManagementDataService.UpdateTransactionQueueSemaphore(transactionQueueSemaphore); } List <TransactionQueueInbound> transactionQueue = await _purchaseOrderManagementDataService.GetInboundTransactionQueue(); foreach (TransactionQueueInbound transactionQueueItem in transactionQueue) { int senderId = transactionQueueItem.SenderTransactionQueueId; string exchangeName = transactionQueueItem.ExchangeName; string transactionCode = transactionQueueItem.TransactionCode; TransactionQueueInboundHistory transactionHistory = await _purchaseOrderManagementDataService.GetInboundTransactionQueueHistoryBySender(senderId, exchangeName); if (transactionHistory != null) { await LogDuplicateMessage(transactionQueueItem); await _purchaseOrderManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId); } else if (transactionCode == TransactionQueueTypes.ProductUpdated) { await ProductUpdated(transactionQueueItem); await _purchaseOrderManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId); } else if (transactionCode == TransactionQueueTypes.InventoryReceived) { await InventoryReceived(transactionQueueItem); await _purchaseOrderManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId); } else if (transactionCode == TransactionQueueTypes.Acknowledgement) { await ProcessAcknowledgement(transactionQueueItem); await _purchaseOrderManagementDataService.DeleteInboundTransactionQueueEntry(transactionQueueItem.TransactionQueueInboundId); } } await _purchaseOrderManagementDataService.UpdateDatabase(); _purchaseOrderManagementDataService.CommitTransaction(); _purchaseOrderManagementDataService.CloseConnection(); } catch (Exception ex) { _purchaseOrderManagementDataService.RollbackTransaction(); returnResponse.ReturnStatus = false; returnResponse.ReturnMessage.Add(ex.Message); } finally { _processing = false; _purchaseOrderManagementDataService.CloseConnection(); } return(returnResponse); }