Ayende は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();
}
ただし、 aが a の最大値をすぐにオーバーフローする可能性があるため、コンストラクターが失敗する可能性があります。たとえば、サーキット ブレーカーのタイムアウトが TimeSpan の最大値である場合です。TimeSpan
DateTime
System.ArgumentOutOfRangeException がキャッチされました
Message="加算または減算された値は、表現できない DateTime になります。"
...
System.DateTime.op_Addition (DateTime d、TimeSpan t) で
この問題を回避し、期待される動作を維持するにはどうすればよいでしょうか?