package dk.thoerup.curcuitbreaker; import java.util.concurrent.atomic.AtomicLong; public final class OpenState implements CircuitBreakerState { final private AtomicLong tripTime = new AtomicLong(0); final private AtomicLong timeout = new AtomicLong(0); public void setTimeout(long timeout) { this.timeout.set( timeout ); } public void preInvoke(CircuitBreaker circuitBreaker) throws Exception { long now = System.currentTimeMillis(); long elapsed = now - tripTime.get(); if(elapsed > timeout.get()) { 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 timeout.get(); } public long getElapsed() { long now = System.currentTimeMillis(); long elapsed = now - tripTime.get(); return elapsed; } }