Пример #1
0
        public async Task <QueueDispatchResult> DispatchToQueuesAsync(IEnumerable <IEventMessage> eventMessages,
                                                                      string eventSourceName, string eventSourceCheckpoint)
        {
            HashSet <string> queuesForAsyncDispatch = new HashSet <string>();
            HashSet <string> queuesForSyncDispatch  = new HashSet <string>();

            foreach (var message in eventMessages)
            {
                var queues = GetEventQueues(message);

                // we need to call EnqueueEventAsync even when queues are empty so that the event record gets marked as dispatched
                await asyncEventQueueManager.EnqueueEventAsync(message, queues.Select(x => x.Sequencing));

                queues.Where(x => !x.SynchronousDispatch).ForEach(x => queuesForAsyncDispatch.Add(x.Sequencing.SequenceName));
                queues.Where(x => x.SynchronousDispatch).ForEach(x => queuesForSyncDispatch.Add(x.Sequencing.SequenceName));
            }

            if (eventSourceName != null)
            {
                await asyncEventQueueManager.SetEventSourceCheckpointAsync(eventSourceName, eventSourceCheckpoint);
            }

            var enqueuedEvents = await asyncEventQueueManager.CommitAsync();

            return(new QueueDispatchResult()
            {
                EnqueuedEventsAsyncProcessed = enqueuedEvents.Where(x => queuesForAsyncDispatch.Contains(x.QueueName)).ToList(),
                EnqueuedEventsSyncProcessed = enqueuedEvents.Where(x => queuesForSyncDispatch.Contains(x.QueueName)).ToList()
            });
        }