private void SubscribeToDispatcherLifeSignal(DispatcherId dispatcherId)
        {
            ReceivingBus.RemoveSubscription(typeof(LifeSignal), dispatcherId.LifeSignalSubscriptionId);

            ReceivingBus.Receive<LifeSignal>(dispatcherId.LifeSignalSubscriptionId, message =>
            {
                lock (LatestLifeSignals)
                {
                    var lifeSignal = (LifeSignal)message;
                    if (!lifeSignal.IsExpired())
                    {
                        LatestLifeSignals[dispatcherId] = lifeSignal;
                        Log.Info("Received life signal from dispatcher '{0}'", dispatcherId);
                    }
                }
            });
        }
        public static IEnumerable<DispatcherActivityLogEntry> GetDispatcherEvents(this MemoryTarget events, DispatcherId dispatcherId = null)
        {
            var allLogs = events.Logs.ToArray();
            var supposedJsonLogs = allLogs.Select(logEntry =>
            {
                var supposedJsonStart = logEntry.IndexOf('{');
                var supposedJsonLength = logEntry.Length - supposedJsonStart;
                if ((supposedJsonStart > 0) && (supposedJsonLength > 2))
                    return logEntry.Substring(supposedJsonStart, supposedJsonLength);
                return null;
            }).Where(l => l != null && l.IsEnclosedByBraces());

            var validJsonLogs = supposedJsonLogs.Select(l => l.FromString()).Where(l => l != null);
            var dispatcherEntries = validJsonLogs.ToArray();
            if (dispatcherId != null)
            {
                dispatcherEntries = dispatcherEntries.Where(
                    e => e.DispatcherId == dispatcherId
                ).ToArray();
            }
            return dispatcherEntries;
        }
        internal static void DispatcherActivity(this Logger log, DispatcherId dispatcherId, DispatcherActivity activity, Job job, JobStatus oldStatus, JobStatus? newStatus = null)
        {
            var logEntry = new DispatcherActivityLogEntry
            {
                DispatcherId = dispatcherId,
                Activity = activity,
                Job = job,
                OldStatus = oldStatus,
                NewStatus = newStatus ?? oldStatus
            };

            log.Info(logEntry);
        }
        internal static DispatcherActivityLogEntry Find(this MemoryTarget events, DispatcherId dispatcherId, DispatcherActivity activity, JobStatus newStatus)
        {
            var dispatcherEntries = events.GetDispatcherEvents(dispatcherId);

            return dispatcherEntries.SingleOrDefault(
                e => (e.Activity == activity) &&
                     (e.NewStatus == newStatus)
            );
        }
 private void NotifyDispatcherWasRestarted(DispatcherId dispatcherId)
 {
     Log.Info("Dispatcher {0} was restarted!", dispatcherId);
     var dispacherRestartedEvent = new DispatcherRestarted { DispatcherId = dispatcherId };
     PublishingBus.Publish(dispacherRestartedEvent, StorageType.NonPersistent);
 }
 private void NotifyDispatcherIsOffline(DispatcherId dispatcherId)
 {
     Log.Info("Dispatcher {0} is offline!", dispatcherId);
     var dispacherOfflineEvent = new DispatcherOffline { DispatcherId = dispatcherId };
     PublishingBus.Publish(dispacherOfflineEvent, StorageType.NonPersistent);
 }
        public bool HasReceivedLaunchConfirmationFrom(DispatcherId dispatcherId)
        {
            LaunchRecord[] launchRecords;

            lock (LaunchRecords)
            {
                launchRecords = LaunchRecords.ToArray();
            }

            var launchRecord = launchRecords.SingleOrDefault(r => r.DispatcherId == dispatcherId);
            return launchRecord != null && launchRecord.IsConfirmed;
        }
 internal static bool FindMatch(this MemoryTarget events, DispatcherId dispatcherId, DispatcherActivity activity)
 {
     var dispatcherEntries = events.GetDispatcherEvents(dispatcherId);
     return dispatcherEntries.Any(e => e.Activity == activity);
 }
 private bool LastLifeSignalIsTooOldToConsiderTheDispatcherIsStillOnline(DispatcherId dispatcherId)
 {
     lock (LatestLifeSignals)
     {
         LifeSignal latestLifeSignal;
         if (LatestLifeSignals.TryGetValue(dispatcherId, out latestLifeSignal))
         {
             return (DateTime.Now - latestLifeSignal.CreationDate) < MaxTimeDispatcherCanBeSilent;
         }
         return false;
     }
 }
        private void CheckIfDispatcherIsOnline(DispatcherId dispatcherId)
        {
            Log.Info("Checking dispatcher {0}!", dispatcherId);

            var dispatcherOnline = LastLifeSignalIsTooOldToConsiderTheDispatcherIsStillOnline(dispatcherId);
            if (dispatcherOnline)
            {
                RemoveDispatcherFromRestartQueue(dispatcherId);
            }
            else
            {
                AddDispatcherToRestartQueue(dispatcherId);
            }
        }
        private void StartDispatcher(DispatcherId dispatcherId)
        {
            Task.Run(() =>
            {
                var dispatcherSettings = Settings.DispatcherSettings.Single(d => d.DispatcherId == dispatcherId);

                var bootstrapSettings = Settings.Clone();
                bootstrapSettings.BootstrapJobs.Clear();
                bootstrapSettings.DispatcherSettings.Clear();
                bootstrapSettings.DispatcherSettings.Add(dispatcherSettings);

                Bootstrapper.Execute(bootstrapSettings);

                NotifyDispatcherWasRestarted(dispatcherId);
            }, CancellationTokenSource.Token);
        }
 private void NotifyDispatcherHasBeenDetached(DispatcherId dispatcherId)
 {
     var dispatcherDetached = new DispatcherDetached
     {
         DispatcherId = dispatcherId
     };
     Log.Debug("Publishing DispatcherDetached event of id {1} for DispatcherId {0}", dispatcherId, dispatcherDetached.MessageId);
     PublishingBus.Publish(dispatcherDetached, StorageType.NonPersistent);
 }
示例#13
0
 /// <summary>
 /// Serializa os dados.
 /// </summary>
 /// <param name="writer"></param>
 public void WriteXml(System.Xml.XmlWriter writer)
 {
     writer.WriteElementString("DispatcherId", SecurityNamespaces.Security, DispatcherId.ToString());
     writer.WriteElementString("SenderName", SecurityNamespaces.Security, SenderName);
     writer.WriteElementString("Title", SecurityNamespaces.Security, (Title ?? MessageFormattable.Empty).Format());
     writer.WriteElementString("Body", SecurityNamespaces.Security, (Body ?? MessageFormattable.Empty).Format());
     writer.WriteElementString("Link", SecurityNamespaces.Security, Link);
 }
 private void RegisterLaunchRequestFor(DispatcherId dispatcherId)
 {
     lock (LaunchRecords)
     {
         LaunchRecords.Add(new LaunchRecord
         {
             DispatcherId = dispatcherId,
             RequestTime = DateTime.Now
         });
     }
 }
        internal static void DispatcherActivity(this Logger log, DispatcherId dispatcherId, DispatcherActivity activity, PoisonPill poisonPill = null, Exception exception = null, bool logAsError = true)
        {
            var logEntry = new DispatcherActivityLogEntry
            {
                DispatcherId = dispatcherId,
                Activity = activity,
                PoisonPill = poisonPill,
                Exception = exception
            };

            if (exception == null)
            {
                if (activity == Dispatching.DispatcherActivity.CheckingForUnfinishedJobs)
                    log.Debug(logEntry);
                else
                    log.Info(logEntry);
            }
            else if (logAsError)
                log.Error(exception, logEntry.ToString());
            else
                log.Info(exception, logEntry.ToString());
        }
 private void AddDispatcherToRestartQueue(DispatcherId dispatcherId)
 {
     lock (OfflineDispatchers)
     {
         if (!OfflineDispatchers.Contains(dispatcherId))
         {
             OfflineDispatchers.Add(dispatcherId);
             NotifyDispatcherIsOffline(dispatcherId);
         }
     }
 }
        private void RemoveDispatcherFromRestartQueue(DispatcherId dispatcherId)
        {
            lock (OfflineDispatchers)
            {
                if (OfflineDispatchers.Contains(dispatcherId))
                    OfflineDispatchers.Remove(dispatcherId);

                NotifyDispatcherIsOnline(dispatcherId);
            }
        }
 internal static DispatcherActivityLogEntry Find(this MemoryTarget events, DispatcherId dispatcherId, DispatcherActivity activity)
 {
     var dispatcherEntries = events.GetDispatcherEvents(dispatcherId);
     return dispatcherEntries.SingleOrDefault(e => e.Activity == activity);
 }
        private void RegisterLaunchConfirmationFor(DispatcherId dispatcherId)
        {
            LaunchRecord[] launchRecords;

            lock (LaunchRecords)
            {
                launchRecords = LaunchRecords.ToArray();
            }

            var launchRecord = launchRecords.FirstOrDefault(r => r.DispatcherId == dispatcherId && !r.IsConfirmed);
            if (launchRecord != null)
                launchRecord.ConfirmationTime = DateTime.Now;
        }