Revision: 22723
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 20, 2010 08:41 by jmcd
Initial Code
class Program { static void Main() { var service = new UnreliableService(); var circuitBreaker = new CircuitBreaker<UnreliableService>(service, 1000); while (true) { circuitBreaker.Invoke( x => x.GetTime(), time => Console.WriteLine(time), () => Console.WriteLine("Fast failing and not waiting for the service")); } } class UnreliableService { static readonly Random Random = new Random(); public DateTime GetTime() { if (Random.Next(10) == 1) { Console.WriteLine("UnreliableService is unreliable"); Thread.Sleep(1000); throw new TimeoutException(); } return DateTime.Now; } } } class CircuitBreaker<T> { private readonly T _subject; private readonly int _resetTimeoutInMilliseconds; private DateTime? _errorTime; public CircuitBreaker(T subject, int resetTimeoutInMilliseconds) { _subject = subject; _resetTimeoutInMilliseconds = resetTimeoutInMilliseconds; _errorTime = null; } public void Invoke<TResult>(Func<T, TResult> func, Action<TResult> successAction, Action failAction) { if (_errorTime.HasValue) { if ((DateTime.Now - _errorTime.Value).TotalMilliseconds < _resetTimeoutInMilliseconds) { failAction.Invoke(); } } try { var result = func.Invoke(_subject); _errorTime = null; successAction.Invoke(result); } catch (Exception) { _errorTime = DateTime.Now; failAction.Invoke(); } } }
Initial URL
Initial Description
Simple implementation of a circuit breaker. Not threadsafe.
Initial Title
Simple Circuit Breaker in C#
Initial Tags
Initial Language
C#