この実装の例外のフィルタリングの回路ブレーカーのパターン?
-
19-09-2019 - |
質問
の 漏電ブレーカーのパターン, からの図書 リリース!, 保護、リモートサービスから要求が失敗(または復)、お客様の管理を繰り返しリモートサービス。私のように 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;
}
}
所属していません StackOverflow