public void Handle(RegisterPotentiallyMissingHeartbeats message) { Heartbeat heartbeat; using (var session = store.OpenSession()) { heartbeat = session.Load <Heartbeat>(message.EndpointInstanceId); if (heartbeat == null) { Logger.Debug("Heartbeat not saved in database yet, will retry again."); return; } if (message.LastHeartbeatAt < heartbeat.LastReportAt) { Logger.Debug("Heartbeat received after detection, ignoring"); return; } if (heartbeat.ReportedStatus == Status.Dead) { Logger.Debug("Endpoint already reported as inactive"); return; } heartbeat.ReportedStatus = Status.Dead; session.SaveChanges(); } statusProvider.RegisterEndpointThatFailedToHeartbeat(heartbeat.EndpointDetails); bus.Publish(new EndpointFailedToHeartbeat { Endpoint = heartbeat.EndpointDetails, LastReceivedAt = heartbeat.LastReportAt, DetectedAt = message.DetectedAt }); }
void Initialise() { using (var session = store.OpenSession()) { session.Query <KnownEndpoint, KnownEndpointIndex>() .Lazily(endpoints => { foreach (var knownEndpoint in endpoints.Where(p => p.Monitored)) { statusProvider.RegisterNewEndpoint(knownEndpoint.EndpointDetails); } }); session.Query <Heartbeat, HeartbeatsIndex>() .Lazily(heartbeats => { foreach (var heartbeat in heartbeats) { if (heartbeat.Disabled) { statusProvider.DisableMonitoring(heartbeat.EndpointDetails); continue; } statusProvider.EnableMonitoring(heartbeat.EndpointDetails); if (heartbeat.ReportedStatus == Status.Beating) { statusProvider.RegisterHeartbeatingEndpoint(heartbeat.EndpointDetails, heartbeat.LastReportAt); } else { statusProvider.RegisterEndpointThatFailedToHeartbeat(heartbeat.EndpointDetails); } } }); session.Advanced.Eagerly.ExecuteAllPendingLazyOperations(); } }