¿Cuáles son algunas implementaciones de filtrado de excepción en el patrón de cortacircuitos?

StackOverflow https://stackoverflow.com/questions/2043419

Pregunta

La Circuito patrón del interruptor , de la liberarlo ! , protege a un servicio remoto de solicitudes mientras se está fallando (o recuperar) y ayuda al cliente es propietario repitió fallo en el servicio remoto. Me gusta con estado disyuntor de Davy Brion y de Ayende perezoso solución de tiempo de espera es muy limpio .

Sin embargo, no he visto un montón de implementaciones de filtrado las excepciones que causarán un aumento en el recuento de fallo de un interruptor de circuito.


No se preocupe acerca de mostrar bloqueo, a menos que su aplicación es particularmente dependiente de bloqueo inteligente. Para su información, Phil Haack parece tener el versión más reciente de TimedLock , usa en artículos de Davy Brion.

¿Fue útil?

Solución

Filtrar por predicado

A predicado pueden proporcionar criterios extendidos y lógica de filtrado.

public void AttemptCall(Action action, Predicate<Exception> match)
{
    try
    {
        action();
    }
    catch(Exception e)
    {
        if(match(e))
            state.ActUponException(e);

        throw;
    }
}

Por ejemplo, es posible que desee aumentar el interruptor automático sólo en un WebException causada por un tiempo de espera.

circuitBreaker.AttemptCall(() => service.DoWork(), e =>
    {
        WebException local = e as WebException;
        if(local == null)
            return false;

        return local.Status == WebExceptionStatus.Timeout;
    });

Otros consejos

Filtro qué tipos aumentarán el recuento

Su primer pensamiento puede ser la construcción de una llamada a un método genérico con un bloque try... catch genérico. Sin embargo, el siguiente no funcionará debido a un error .NET , por favor ver estos preguntas para obtener más información.

public void AttemptCall<TException>(Action action)
    where TException : Exception
{
    try
    {
        action();
    }
    catch(TException e)
    {
         state.ActUponExcpetion(e);
         throw;
    }
}

Es necesario capturar todas las excepciones e investigar el tipo.

public void AttemptCall<TException>(Action action)
    where TException : Exception
{
    try
    {
        action();
    }
    catch(TException e)
    {
         if(e is TException)
             state.ActUponExcpetion(e);

         throw;
    }
}

Filtro qué tipos no va a aumentar el conteo

Tim Ross escribió acerca de esta .

private readonly List<Exception> ignored = new List<Exception>();

public void Ignore<TException>() 
    where TException : Exception
{
    Type type = typeof(TException);
    if(ignored.Contains(type))
        return;

    ignored.Add(type);
}

public void AttemptCall(Action action)
{
     try
     {
         action();
     }
     catch(Exception e)
     {
         if(!ignore.Contains(e.GetType()))
             state.ActUponException(e);

         throw;
     }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top