package net.greencoding.thysdrus.circuitbreaker.core.model; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Entry class holds circuit breaker status and all needed information for * status transition. * * @author Nabil Ben Said (nabil.ben.said@gmail.com) * */ public class CircuitBreakerEntry { private CircuitBreaker circuitBreaker; private CircuitBreakerStatus status = CircuitBreakerStatus.CLOSED; private Lock halfOpenLock = new ReentrantLock();; private List<Long> lastFailureTimestamps = new ArrayList<Long>(); private long lastOpenedTimestamp; public CircuitBreakerEntry(CircuitBreaker circuitBreaker) { this.circuitBreaker = circuitBreaker; } public CircuitBreaker getCircuitBreaker() { return circuitBreaker; } public CircuitBreakerStatus getStatus() { return status; } public Lock getHalfOpenLock() { return halfOpenLock; } public void setCircuitBreaker(CircuitBreaker circuitBreaker) { this.circuitBreaker = circuitBreaker; } public void setStatus(CircuitBreakerStatus status) { this.status = status; } public void setHalfOpenLock(Lock halfOpenLock) { this.halfOpenLock = halfOpenLock; } public List<Long> getLastFailureTimestamps() { return lastFailureTimestamps; } public synchronized void addFailureTimestamp(long timestamp) { if (lastFailureTimestamps.size() == circuitBreaker.getFailureThreshold()) { lastFailureTimestamps.remove(0); } lastFailureTimestamps.add(timestamp); } public long getLastOpenedTimestamp() { return lastOpenedTimestamp; } public void setLastOpenedTimestamp(long lastOpenedTimestamp) { this.lastOpenedTimestamp = lastOpenedTimestamp; } @Override public String toString() { return "CircuitBreakerEntry [circuitBreaker=" + circuitBreaker + ", status=" + status + ", halfOpenLock=" + halfOpenLock + ", lastFailureTimestamps=" + lastFailureTimestamps + ", lastOpenedTimestamp=" + lastOpenedTimestamp + "]"; } }