package org.greencheek.elasticacheconfig.client; import org.greencheek.elasticacheconfig.confighandler.AsyncConfigInfoMessageHandler; import org.greencheek.elasticacheconfig.confighandler.AsyncExecutorServiceConfigInfoMessageHandler; import org.greencheek.elasticacheconfig.confighandler.ConfigInfoProcessor; import org.greencheek.elasticacheconfig.confighandler.SystemOutConfigInfoProcessor; import org.greencheek.elasticacheconfig.handler.AsciiRequestConfigInfoScheduler; import org.greencheek.elasticacheconfig.handler.RequestConfigInfoScheduler; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * Created by dominictootell on 20/07/2014. */ public class ConfigRetrievalSettingsBuilder { public static final String ELASTICACHE_HOST = "localhost"; public static final int ELASTICACHE_PORT = 11211; public static final TimeUnit RECONNECT_DELAY_TIMEUNIT = TimeUnit.SECONDS; public static final long RECONNECT_DELAY = 5; public static final TimeUnit GET_CONFIG_POLLING_TIMEUNIT = TimeUnit.SECONDS; public static final long GET_CONFIG_POLLING_TIME = 60; public static final long GET_CONFIG_POLLING_INITIAL_DELAY = 0; public static final int CONNECTION_TIMEOUT_IN_MILLIS = 3000; // If not response recieved for the last poll, then re-establish the connection public static final TimeUnit IDLE_TIMEOUT_TIMEUNIT = TimeUnit.SECONDS; public static final long IDLE_READ_TIMEOUT = 70; public static final int NO_CONSECUTIVE_INVALID_CONFIGS_BEFORE_RECONNECT = 5; private RequestConfigInfoScheduler clientConfigInfoScheduler = null; private AsyncConfigInfoMessageHandler configInfoMessageHandler = null; private ConfigInfoProcessor configInfoProcessor = null; // // private TimeUnit idleTimeoutTimeUnit = IDLE_TIMEOUT_TIMEUNIT; private long idleReadTimeout = IDLE_READ_TIMEOUT; private TimeUnit reconnectDelayTimeUnit = RECONNECT_DELAY_TIMEUNIT; private long reconnectDelay = RECONNECT_DELAY; private int connectionTimeoutInMillis = CONNECTION_TIMEOUT_IN_MILLIS; private TimeUnit configPollingTimeUnit = GET_CONFIG_POLLING_TIMEUNIT; private long configPollingTime = GET_CONFIG_POLLING_TIME; private long configPollingInitialDelay = GET_CONFIG_POLLING_INITIAL_DELAY; private int numberOfInvalidConfigsBeforeReconnect = NO_CONSECUTIVE_INVALID_CONFIGS_BEFORE_RECONNECT; private List<ElastiCacheServerConnectionDetails> elasticCacheHosts = new ArrayList<ElastiCacheServerConnectionDetails>(); public ConfigRetrievalSettingsBuilder addElastiCacheHost(ElastiCacheServerConnectionDetails details) { elasticCacheHosts.add(details); return this; } public ConfigRetrievalSettingsBuilder addElastiCacheHosts(ElastiCacheServerConnectionDetails[] details) { for(ElastiCacheServerConnectionDetails host : details) { elasticCacheHosts.add(host); } return this; } public ConfigRetrievalSettingsBuilder setIdleReadTimeout(long idleReadTimeout,TimeUnit idleTimeoutTimeUnit) { this.idleReadTimeout = idleReadTimeout; return this; } public ConfigRetrievalSettingsBuilder setReconnectDelay(long reconnectDelay,TimeUnit reconnectDelayTimeUnit) { this.reconnectDelay = reconnectDelay; this.reconnectDelayTimeUnit = reconnectDelayTimeUnit; return this; } public ConfigRetrievalSettingsBuilder setConfigPollingTime(long configPollingInitialDelay, long configPollingTime,TimeUnit configPollingTimeUnit) { this.configPollingTime = configPollingTime; this.configPollingTimeUnit = configPollingTimeUnit; this.configPollingInitialDelay = configPollingInitialDelay; return this; } public ConfigRetrievalSettingsBuilder setClientConfigInfoScheduler(RequestConfigInfoScheduler periodicConfigObtainer) { this.clientConfigInfoScheduler = periodicConfigObtainer; return this; } public ConfigRetrievalSettingsBuilder setConfigInfoMessageHandler(AsyncConfigInfoMessageHandler newConfigMessageHandler) { this.configInfoMessageHandler = newConfigMessageHandler; return this; } public ConfigRetrievalSettingsBuilder setConfigInfoProcessor(ConfigInfoProcessor configInfoProcessor) { this.configInfoProcessor = configInfoProcessor; return this; } public ConfigRetrievalSettingsBuilder setNumberOfInvalidConfigsBeforeReconnect(int numberOfInvalidConfigsBeforeReconnect) { this.numberOfInvalidConfigsBeforeReconnect = numberOfInvalidConfigsBeforeReconnect; return this; } public ConfigRetrievalSettingsBuilder setConnectionTimeoutInMillis(int connectionTimeoutInMillis) { this.connectionTimeoutInMillis = connectionTimeoutInMillis; return this; } public ConfigRetrievalSettings build() { AsyncConfigInfoMessageHandler messageHandler; RequestConfigInfoScheduler periodicConfigObtainer; ConfigInfoProcessor configInfoProcessor; if(clientConfigInfoScheduler==null) { periodicConfigObtainer = new AsciiRequestConfigInfoScheduler(configPollingTimeUnit, configPollingInitialDelay, configPollingTime); } else { periodicConfigObtainer = clientConfigInfoScheduler; } if(this.configInfoProcessor==null) { configInfoProcessor = new SystemOutConfigInfoProcessor(); } else { configInfoProcessor = this.configInfoProcessor; } if(configInfoMessageHandler==null) { messageHandler = new AsyncExecutorServiceConfigInfoMessageHandler(configInfoProcessor); } else { messageHandler = configInfoMessageHandler; } return new ConfigRetrievalSettings(periodicConfigObtainer,messageHandler, elasticCacheHosts.toArray(new ElastiCacheServerConnectionDetails[elasticCacheHosts.size()]),idleTimeoutTimeUnit,idleReadTimeout, reconnectDelayTimeUnit,reconnectDelay, numberOfInvalidConfigsBeforeReconnect,connectionTimeoutInMillis); } }