package org.ff4j.cache; /* * #%L * ff4j-core * %% * Copyright (C) 2013 - 2016 FF4J * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import java.io.Serializable; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import org.ff4j.core.FeatureStore; import org.ff4j.property.store.PropertyStore; /** * Poll target stores on a fixed delay basis and fill cache to avoid reaching TTL of key. * * @author Cedrick LUNVEN (@clunven) */ public class Store2CachePollingScheduler implements Serializable{ /** Serial. */ private static final long serialVersionUID = -1198719730422859724L; /** polling delay. */ private long pollingDelay = 10000; /** initial delay at start. */ private long initialDelay = 0; /** Scheduler for the worker. */ private ScheduledExecutorService executor; /** Current runnable. */ private Store2CachePollingWorker worker; /** * Parameterized constructor. * * @param sf * source feature store * @param sp * source property store * @param cp * current cache manager */ public Store2CachePollingScheduler(FeatureStore sf, PropertyStore sp, FF4JCacheManager cp) { worker = new Store2CachePollingWorker(sf, sp, cp); executor = Executors.newScheduledThreadPool(1, new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r, "FF4j_Store2CachePollingWorker"); t.setDaemon(true); return t; } }); } /** * Start polling with a polling */ public void start(long delay) { this.pollingDelay = delay; start(); } /** * Start polling. */ public void start() { executor.scheduleWithFixedDelay(worker, initialDelay, pollingDelay, TimeUnit.MILLISECONDS); } /** Stop Polling. */ public void stop() { if (executor != null) { executor.shutdown(); executor = null; } } /** * Getter accessor for attribute 'pollingDelay'. * * @return * current value of 'pollingDelay' */ public long getPollingDelay() { return pollingDelay; } /** * Setter accessor for attribute 'pollingDelay'. * @param pollingDelay * new value for 'pollingDelay ' */ public void setPollingDelay(long pollingDelay) { this.pollingDelay = pollingDelay; } /** * Getter accessor for attribute 'initialDelay'. * * @return * current value of 'initialDelay' */ public long getInitialDelay() { return initialDelay; } /** * Setter accessor for attribute 'initialDelay'. * @param initialDelay * new value for 'initialDelay ' */ public void setInitialDelay(long initialDelay) { this.initialDelay = initialDelay; } }