質問

漏電ブレーカーのパターン, からの図書 リリース!, 保護、リモートサービスから要求が失敗(または復)、お客様の管理を繰り返しリモートサービス。私のように Davy Brionのステート回路ブレーカーAyende流タイムアウトを修正 とても綺麗です。

しかし、私が見ていない多くの 実装はフィルタリング る例が増加し、失敗回数の回路ブレーカーを切る。


いを示していロックない限り、実装が、特に異なロックしなければなりません。ちなみに、フィルハての 最新バージョンのTimedLock, 使用するDavy Brionが関連していたからである。

役に立ちましたか?

解決

フィルタープレディケー

A 述語 で拡張する基準およびフィルタリング。

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

        throw;
    }
}

例えば、増加する場合がありますの回路ブレーカーのみについて WebException による、タイムアウト.

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

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

他のヒント

フィルターの種類を増やすとカウント

最初の想いが可能となりましたが構築汎用のメソッドの呼び出し、一般 try... catch ブロックです。ただし、以下に動作しませんよ a.純グ, をご覧ください これらの 質問 ます。

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

必要なもの 全ての例外 調査のタイプです。

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

         throw;
    }
}

フィルターの種類は増えませんのカウント

ティムロスについて書いたこ.

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;
     }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top