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);
 }