书中的电路断路器模式保护远程服务在失败(或恢复)时不受请求的影响,并帮助客户端管理重复的远程服务故障。我喜欢Davy Brion有状态断路器和Ayende的延迟超时修复非常干净。
然而,我还没有看到很多实现过滤,这种异常会导致断路器的故障计数增加。
不要担心显示锁定,除非您的实现特别依赖于聪明的锁定。菲尔·哈克似乎在大卫·布隆的文章中使用了http://haacked.com/archive/2004/10/13/timedlockwithstacktracesstrikesback.aspx。
发布于 2010-01-11 17:08:00
谓词过滤
谓词可以提供扩展的标准和过滤逻辑。
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;
});发布于 2010-01-11 17:06:15
筛选将增加计数的类型。
您的第一个想法可能是使用泛型try... catch块构造泛型方法调用。但是,由于一个.NET错误,下面的内容将无法工作,请参阅这些 问题以获得更多信息。
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;
}
}发布于 2010-01-11 17:06:47
筛选不会增加计数的类型。
蒂姆·罗斯写了这篇文章。
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;
}
}https://stackoverflow.com/questions/2043419
复制相似问题