package dk.thoerup.circuitbreaker; import java.util.concurrent.atomic.AtomicLong; import dk.thoerup.circuitbreaker.config.BreakerConfig; public final class OpenState implements CircuitBreakerState { final private AtomicLong tripTime = new AtomicLong(0); BreakerConfig config; public void setTimeout(BreakerConfig config) { this.config = config; } public void preInvoke(CircuitBreaker circuitBreaker) throws Exception { long now = System.currentTimeMillis(); long elapsed = now - tripTime.get(); if(elapsed > config.getTimeout()) { circuitBreaker.attemptReset(); } else { throw new CircuitBreakerException("Circuit Breaker is open; calls are failing fast"); } } public void postInvoke(CircuitBreaker circuitBreaker) throws Exception { // NO OP } public void onError(CircuitBreaker circuitBreaker, Exception t) throws Exception { // NO OP } void trip() { long now = System.currentTimeMillis(); tripTime.set(now); } public String getName() { return "Open"; } public long getTimeout() { return config.getTimeout(); } public long getElapsed() { long now = System.currentTimeMillis(); long elapsed = now - tripTime.get(); return elapsed; } }