Exemplo n.º 1
0
        public void EnqueueMessage(MessageBusMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (!MessageBusFilterComparer.IsMatch(message.Message, Filter))
            {
                return;
            }

            _messageQueue.Enqueue(message);
        }
Exemplo n.º 2
0
        void DispatchMessageBusMessages()
        {
            while (!_systemCancellationToken.Token.IsCancellationRequested)
            {
                try
                {
                    var message = _messageQueue.Take(_systemCancellationToken.Token);
                    if (_systemCancellationToken.Token.IsCancellationRequested)
                    {
                        return;
                    }

                    if (message == null)
                    {
                        continue;
                    }

                    _messageHistory.Add(message);

                    List <MessageBusSubscriber> subscribers;
                    lock (_subscribers)
                    {
                        subscribers = new List <MessageBusSubscriber>(_subscribers.Values);
                    }

                    foreach (var subscriber in subscribers)
                    {
                        if (MessageBusFilterComparer.IsMatch(message.Message, subscriber.Filter))
                        {
                            Task.Run(() => subscriber.ProcessMessage(message.Message)).Forget(_logger);
                            _processingRateCounter.Increment();
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                }
                catch (OperationCanceledException)
                {
                }
                catch (Exception exception)
                {
                    _logger.LogError(exception, "Error while dispatching messages.");
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                }
            }
        }