public void Detach(IRedisHeartBeatProbe probe) { if (!ReferenceEquals(probe, null)) { lock (m_SyncRoot) { var probes = m_Probes; if (probes == null) { Stop(); } else { var cp = probes.FirstOrDefault((c) => ReferenceEquals(c.Probe, probe)); if (!ReferenceEquals(cp, null)) { try { probes.Remove(cp); cp.Dispose(); } finally { if (probes.Count == 0) { Stop(); } } } } } } }
public CardioProbe(IRedisHeartBeatProbe probe, int intervalInSecs, Func <object, RedisCardioPulseStatus, bool> onSetHealthState) { m_Probe = probe; m_OnSetStatus = onSetHealthState; m_IsDisposable = probe is IRedisDisposableBase; IntervalInMillisecs = 1000 * Math.Max(RedisConstants.MinHeartBeatIntervalSecs, Math.Min(RedisConstants.MaxHeartBeatIntervalSecs, intervalInSecs)); }
public RedisCardioPulseStatus(IRedisHeartBeatProbe probe, RedisCardioProbeStatus currentStatus, RedisCardioProbeStatus newStatus, long failCount, long successCount) : this() { Probe = probe; NewStatus = newStatus; CurrentStatus = currentStatus; FailCount = failCount; SuccessCount = successCount; }
public void Attach(IRedisHeartBeatProbe probe, int interval) { ValidateNotDisposed(); if (!ReferenceEquals(probe, null)) { var asDisposable = probe as IRedisDisposableBase; if (ReferenceEquals(asDisposable, null) || !asDisposable.Disposed) { lock (m_SyncRoot) { var probes = m_Probes; if (probes != null) { var exists = probes.Any(cp => cp.IsAlive() && ReferenceEquals(probe, cp.Probe)); if (!exists && !Disposed) { probes.Add(new CardioProbe(probe, interval, (obj, status) => { if (status.NewStatus != status.CurrentStatus) { var canSet = CanUpdateHealthState(obj, status); if (canSet) { try { var cp = (CardioProbe)obj; var prb = cp.Probe; if (!ReferenceEquals(prb, null)) { prb.PulseStateChanged(status); } } catch (Exception) { } } return(canSet); } return(false); })); Start(); } } } } } }