Exemple #1
0
        private async Task <Tuple <ResponseMessageDto, MessageQueue> > Action(MessageQueue messageQueue)
        {
            var action        = _actionRetriever.GetAction((byte)MessageStatusEnum.New, (byte)messageQueue.MessageType);
            var actionResults = await action.PerformAction(messageQueue);

            messageQueue.MessageStatus = actionResults.Item1.Success ? MessageStatusEnum.Sent : MessageStatusEnum.Failed;

            return(actionResults);
        }
Exemple #2
0
        public async Task ExecuteQueue(List <byte> messageStatuses,
                                       int limit = 30, CancellationToken cancellationToken = default)
        {
            await _messageQueueRepository.ExecuteTransactions(action : async() =>
            {
                var queued        = await _messageQueueRepository.GetMessagesToProcess(messageStatuses, limit, cancellationToken);
                var messageQueues = queued.ToList();
                if (messageQueues.Count == 0)
                {
                    return;
                }

                foreach (var queue in messageQueues)
                {
                    try
                    {
                        if (await _employeeExclusionRequest.IsEmployeeExcludedForCommunication(queue.SystemUniqueId, cancellationToken))
                        {
                            continue;
                        }
                        var action        = _actionRetriever.GetAction((byte)queue.MessageStatus, (byte)queue.MessageType);
                        var actionResults = await action.PerformAction(queue);

                        if (actionResults.Item1.Success)
                        {
                            await _messageQueueRepository.Update(actionResults.Item2);
                        }
                        else
                        {
                            actionResults.Item2.RetryCount++;

                            await _messageQueueRepository.Update(actionResults.Item2);
                        }
                    }
                    catch (Exception ex)
                    {
                        // TODO: log an exception
                    }
                    finally
                    {
                        // revert the IsBusyProcessing column back to false - else they won't be picked up again by the next job.
                        queue.IsBusyProcessing = false;
                        queue.UpdatedDate      = DateTime.UtcNow;
                        await _messageQueueRepository.Update(queue);
                    }
                }
            }, cancellationToken : cancellationToken);
        }