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#