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
            });
        }
Example #2
0
            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();
                }
            }