Frage

Die Circuit Breaker Muster , aus dem Buch loslassen ! schützt einen Remote-Service von Anfragen während es ausfällt (oder das Einholen) und hilft dem Client-Remote-Service-Ausfall wiederholt zu verwalten. Ich mag Davy Brions Stateful Schutzschalter und Ayende faule Timeout fix ist sehr sauber .

Allerdings habe ich nicht viel Implementierungen von Filtern gesehen , die Ausnahmen eine Erhöhung der Ausfall Zählung eines Schutzschalters verursacht.


Mach dir keine Sorgen Verriegelungs-, es sei denn, Ihre Implementierung ist besonders abhängig von cleveren Verriegelung. FYI, erscheint Phil Haack die neueste Version von TimedLock zu haben, verwendet in Davy Brion Artikel.

War es hilfreich?

Lösung

Filter nach Predicate

Prädikat können erweiterte Kriterien liefern und Filterung Logik.

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

        throw;
    }
}

Zum Beispiel können Sie den Schutzschalter nur auf einem WebException durch einen Timeout verursacht erhöhen.

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

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

Andere Tipps

Filter, welche Typen die Zählung

wird zunehmen

Ihr erster Gedanke kann einen generischen Methodenaufruf mit einem generischen try... catch Block zu konstruieren. Allerdings wird die unten nicht durch Arbeit an eine .NET-Fehler finden Sie in diesen Fragen für weitere Informationen.

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

Sie müssen alle Ausnahmen fangen und die Art zu untersuchen.

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

         throw;
    }
}

Filter, die Typen nicht die Zählung

erhöhen

Tim Ross schrieb über dieses .

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;
     }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top