2010-01-11 11 views
1

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?

Répondre

2

faire un peu de mathématiques

déterminer si le délai d'attente est plus que le reste de la valeur maximale d'un DateTime et la DateTime actuelle. Un maximum de TimeSpan indique généralement un délai d'expiration infiniment fonctionnel (ce qui en fait un disjoncteur "unique").

public OpenState(CircuitBreaker outer) 
    : base(outer) 
{ 
    DateTime now = DateTime.UtcNow; 
    expiry = outer.Timeout > (DateTime.MaxValue - now) 
     ? DateTime.MaxValue 
     : now + outer.Timeout; 
}