1

Ayende 发布了对 Davy Brion断路器的修改,其中他将超时分辨率更改为惰性模型。

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();
}

但是,构造函数可能会失败,因为 aTimeSpan可以快速溢出 a 的最大值DateTime。例如,当断路器的超时是 TimeSpan 的最大值时。

System.ArgumentOutOfRangeException 被捕获

Message="添加或减去的值导致无法表示的日期时间。"

...

在 System.DateTime.op_Addition(DateTime d, TimeSpan t)

我们如何避免这个问题并保持预期的行为?

4

1 回答 1

2

做一点数学

确定超时是否大于a 的最大值DateTime和当前的余数DateTime。最大值TimeSpan通常表示功能无限超时(使其成为“一次性”断路器)。

public OpenState(CircuitBreaker outer)
    : base(outer)
{
    DateTime now = DateTime.UtcNow;
    expiry = outer.Timeout > (DateTime.MaxValue - now) 
        ? DateTime.MaxValue
        : now + outer.Timeout;
}
于 2010-01-11T17:24:52.187 回答