Ayende a publié a modification sur Davy Brion's circuit breaker, dans lequel il a changé la résolution du délai d'expiration en un modèle paresseux.La résolution de délai d'expiration par défaut Le disjoncteur lance ArgumentOutOfRangeException
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();
}
Cependant, le constructeur peut échouer parce qu'un TimeSpan
peut déborder rapidement la valeur maximale d'un DateTime
. Par exemple, lorsque le délai du disjoncteur est la valeur maximale d'un TimeSpan.
System.ArgumentOutOfRangeException a été capturé
message = "La valeur ajoutée ou soustraites des résultats dans un DateTime irreprésentable."
...
à System.DateTime.op_Addition (DateTime d, TimeSpan t)
Comment pouvons-nous éviter ce problème et de maintenir le comportement attendu?