延迟超时解析Circuit Breaker抛出ArgumentOutOfRangeException

时间:2010-01-11 17:24:37

标签: c# exception-handling timespan circuit-breaker

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)

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

1 个答案:

答案 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;
}