private void QueueMonitor_MessagePublished(object sender, MessagePublishedEventArgs e) { var clients = _appDomainHandlers.Values.Where(c => string.Equals(c.ApplicationPath, e.ApplicationPath, StringComparison.OrdinalIgnoreCase)); Parallel.ForEach(clients, client => client.EnsureServiceAvailable(e.QueueName)); }
private void Refresh() { TraceInformation("Querying RabbitMQ Management service.", GetType()); using (var client = CreateWebClient()) { var json = client.DownloadString("/api/queues"); var queues = _deserializer.Deserialize<Dictionary<string, object>[]>(json) .Where(q => q.ContainsKey("message_stats")) .Where(q => q.ContainsKey("messages_ready")) .Where(q => q.ContainsKey("arguments")) .Select(q => new { Arguments = (Dictionary<string, object>) q["arguments"], QueueName = (string)q["name"], MessagesReady = Convert.ToInt64(q["messages_ready"]), MessageStats = (Dictionary<string, object>)q["message_stats"], }) .Where(q => Constants.Scheme.Equals(q.Arguments.GetValueOrDefault(TaskQueueReaderQueueArguments.Scheme))) .Where(q => true.Equals(q.Arguments.ContainsKey(TaskQueueReaderQueueArguments.IsTaskInputQueue))) .Select(q => new { q.QueueName, PublishCount = Convert.ToInt64(q.MessageStats.GetValueOrDefault("publish") ?? 0), q.MessagesReady, }) .ToArray(); var queuesToRemove = _queueStats.Keys.Except(queues.Select(q => q.QueueName)).ToArray(); foreach (var queueToRemove in queuesToRemove) { _queueStats.Remove(queueToRemove); OnQueueDeleted(new QueueDeletedEventArgs(queueToRemove)); } foreach (var queue in queues) { var stats = _queueStats.GetValueOrDefault(queue.QueueName); bool publish = false; if (stats == null) { stats = new QueueStatistics(); _queueStats.Add(queue.QueueName, stats); publish = (queue.PublishCount > 0); } stats.MessagesReady = queue.MessagesReady; if (stats.PublishCount != queue.PublishCount) { publish = true; } if (publish) { stats.UpdatePublishInfo(queue.PublishCount); var args = new MessagePublishedEventArgs(queue.QueueName, GetApplicationPath(queue.QueueName)); OnMessagePublished(args); } } } }
private void QueueMonitor_MessagePublished(object sender, MessagePublishedEventArgs e) { EnqueueApplicationAction(apps => { var app = apps.GetValueOrDefault(e.ApplicationPath); if (app != null) { TraceInformation($"Detected message publication on the queue [{e.QueueName}] for the application [{app.ApplicationKey}:{app.ApplicationPath}].", GetType()); OpenNewListenerChannelInstance(app, NewListenerChannelInstanceConstraints.None); } }); }
protected virtual void OnMessagePublished(MessagePublishedEventArgs e) { TraceInformation($"OnMessagePublished[{nameof(e.ApplicationPath)}={e.ApplicationPath}, {nameof(e.QueueName)}={e.QueueName}].", GetType()); MessagePublished?.Invoke(this, e); }