package net.greencoding.thysdrus.circuitbreaker.core;
import net.greencoding.thysdrus.circuitbreaker.core.model.CircuitBreaker;
import net.greencoding.thysdrus.circuitbreaker.core.model.CircuitBreakerRegisterResult;
import net.greencoding.thysdrus.circuitbreaker.core.model.CircuitBreakerStatus;
/**
*
* @author Nabil Ben Said (nabil.ben.said@gmail.com)
*
*/
public interface CircuitBreakerRegistry {
public boolean isRegistered(String circuitBreakerKey);
public CircuitBreakerRegisterResult registerCircuitBreaker(CircuitBreaker circuitBreaker);
public CircuitBreakerStatus getCircuitBreakerStatus(String circuitBreakerKey);
public boolean halfOpenConditionSatisfied(String circuitBreakerKey);
/**
* tries to get the HalfOpenLock for the CirucuitBreaker with the given CircuitBreakerkey
*
* @param CircuitBreakerKey key of circuit breaker to lock
* @return
*/
public boolean tryHalfOpenLock(String circuitBreakerKey);
/**
* releases the HalfOpenLock if any exits.
* @param circuitBreakerKey
* @return true if lock is release successfully
*/
public boolean releaseHalfOpenLock(String circuitBreakerKey, CircuitBreakerStatus status);
/**
* resets the circuit breaker status to Closed.
* @param CircuitBreakerKey key of the circuit breaker to reset.
*/
public void resetCircuitBreaker(String circuitBreakerKey);
public void unregisterCircuitBreaker(String circuitBreakerKey);
public void destroy();
/**
* returns true if cause is registered as failure indicator for circuit breaker with the given key.
* @param circuitBreakerKey
* @param cause
* @return
*/
public boolean handleMethodInvocationException(String circuitBreakerKey, Throwable cause, boolean inHalfOpenStatus);
}