public static void RegisterCircuitBreaker(string key, CircuitBreaker circuitBreaker) { if (CircuitBreakers.TryAdd(key, circuitBreaker)) return; throw new InvalidOperationException($"A circuit breaker with key: {key} already registered."); }
public static CircuitBreaker GetCircuitBreaker(string key) { if(CircuitBreakers.TryGetValue(key, out var circuitBreaker)) return circuitBreaker; throw new ArgumentException($"No circuit breaker registered with key: {key}.", nameof(key)); }
public async Task Process(CancellationToken token) { var stopwatch = new Stopwatch(); Job currentJob = null; while (!token.IsCancellationRequested) { stopwatch.Start(); try { var activeJobs = await jobsDataService.GetActiveJobs(); foreach (var job in activeJobs) { currentJob = job; if (CircuitBreakers.IsBroken(job.GetJobIdentifier())) { Logger.Error($"{job.GetJobIdentifier()} has a broken circuit breaker"); continue; } var schedule = jsonSerializer.Deserialize <Schedule>(job.schedule); if (schedule.start >= DateTime.UtcNow) { continue; } var nextEvent = schedulerService.GetNextEvent(schedule, job.last_executed_at); Logger.Trace($"Next execution for {job.command_name}:{job.id} at {nextEvent}"); if (nextEvent != null && nextEvent < clock.UtcNow) { Logger.Trace($"Executing job {job.command_name}:{job.id}"); WrapFireEvent(job); } if (nextEvent == null) { Logger.Trace($"Marking job {job.command_name}:{job.id} as expired"); await jobsDataService.MarkJobExpired(job.id); } } } catch (Exception e) { Logger.Error($"Error Job {currentJob?.command_name}:{currentJob?.id} Processing: {e.Message}"); if (currentJob != null) { CircuitBreakers.RecordBreak(currentJob.GetJobIdentifier()); } } while (stopwatch.ElapsedMilliseconds < configuration.JobProcessThrottleMs()) { await Task.Delay(100, token); } stopwatch.Reset(); } }
public static CircuitBreaker GetOrAddCircuitBreaker(string key, Func<CircuitBreaker> factory) { return CircuitBreakers.GetOrAdd(key, (opKey) => factory()); }