public void EnqueueMessage(MessageBusMessage message) { if (message == null) { throw new ArgumentNullException(nameof(message)); } if (!MessageBusFilterComparer.IsMatch(message.Message, Filter)) { return; } _messageQueue.Enqueue(message); }
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)); } } }