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