Exemple #1
0
        private void ListenToInternal <TEvent, THandler>()
            where TEvent : Event
            where THandler : IHandler <TEvent>
        {
            var queueUrl = _eventBusInitializer.GetQueueUrl <TEvent>();
            var handler  = Activator.CreateInstance <THandler>();

            Task.Factory.StartNew(async() =>
            {
                while (true)
                {
                    var eventsReceived = await _sqsOperations.Dequeue(queueUrl);

                    foreach (var eventReceivedRaw in eventsReceived)
                    {
                        _logger.Info($"Received {typeof(TEvent)}", eventReceivedRaw.Body);

                        var eventReceived = JsonConvert.DeserializeObject <SqsPulledObject>(eventReceivedRaw.Body);

                        try
                        {
                            var isHandledSuccessfully = await handler.HandleAsync(JsonConvert.DeserializeObject <TEvent>(eventReceived.Message));

                            if (isHandledSuccessfully)
                            {
                                #pragma warning disable CS4014
                                Task.Run(() => _sqsOperations.Delete(queueUrl, eventReceivedRaw));
                                #pragma warning restore CS4014
                            }
                            else
                            {
                                //TODO
                                //Dead letter queue
                            }
                        }
                        catch (Exception e)
                        {
                            _logger.Error($"An unexpected error happened when processing the message {typeof(TEvent)}. {e}");
                        }
                    }
                }
            },
                                  _eventBusInitializer.GetCancellationToken <TEvent>().Token,
                                  TaskCreationOptions.LongRunning, TaskScheduler.Default);
        }