package org.distributeme.core.routing.blacklisting; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.distributeme.core.ClientSideCallContext; import org.distributeme.core.routing.GenericRouterConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Default blacklisting strategy. A service instance will be blacklisted after one failed call. * This behavior was default in distributeme 2.3.1 * * * Created by rboehling on 2/21/17. */ public class DefaultBlacklistingStrategy implements BlacklistingStrategy { /** * Map with timestamps for last server failures. */ private ConcurrentMap<String, Long> serverFailureTimestamps = new ConcurrentHashMap<>(); private GenericRouterConfiguration configuration; private Logger logger = LoggerFactory.getLogger(DefaultBlacklistingStrategy.class); @Override public boolean isBlacklisted(String instanceId) { Long lastFailed = serverFailureTimestamps.get(instanceId); return lastFailed != null && (System.currentTimeMillis() - lastFailed) < configuration.getBlacklistTime(); } @Override public void notifyCallFailed(ClientSideCallContext clientSideCallContext) { logger.info(clientSideCallContext.getServiceId()+ " will be blacklisted for "+configuration.getBlacklistTime()+" ms"); serverFailureTimestamps.put(clientSideCallContext.getServiceId(), System.currentTimeMillis()); } @Override public void setConfiguration(GenericRouterConfiguration configuration) { this.configuration = configuration; } }