Ayende将a modification发布给Davy Brion的circuit breaker,其中他将超时分辨率更改为懒惰模型。
private readonly DateTime expiry;
public OpenState(CircuitBreaker outer)
: base(outer)
{
expiry = DateTime.UtcNow + outer.timeout;
}
public override void ProtectedCodeIsAboutToBeCalled()
{
if(DateTime.UtcNow < expiry)
throw new OpenCircuitException();
outer.MoveToHalfOpenState();
}
但是,构造函数可能会失败,因为TimeSpan
可以快速溢出DateTime
的最大值。例如,当断路器的超时是TimeSpan的最大值时。
发现了System.ArgumentOutOfRangeException
Message =“添加或减去的值会导致无法表示的DateTime。”
...
在System.DateTime.op_Addition(DateTime d,TimeSpan t)
我们如何避免这个问题并维持预期的行为?
答案 0 :(得分:2)
确定超时是否大于DateTime
和当前DateTime
的最大值的余数。最大TimeSpan
通常表示功能无限超时(使其成为“一次性”断路器)。
public OpenState(CircuitBreaker outer)
: base(outer)
{
DateTime now = DateTime.UtcNow;
expiry = outer.Timeout > (DateTime.MaxValue - now)
? DateTime.MaxValue
: now + outer.Timeout;
}