package org.peerbox.watchservice.filetree.persistency;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.inject.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
/**
* This class is responsible for periodically storing metadata about files.
* The remote user profile as well as the local file tree is persisted in a database once in a while.
*
* @author albrecht
*
*/
public class PeriodicFileDataPersister {
private static final Logger logger = LoggerFactory.getLogger(PeriodicFileDataPersister.class);
private ScheduledExecutorService scheduler;
// scheduling delay in seconds
private static final long SCHEDULED_DELAY = 30L;
private static final long INITIAL_DELAY = 0L;
private Provider<PersistLocalTree> localTaskProvider;
private Provider<PersistRemoteProfile> remoteTaskProvider;
// persistence tasks
private PersistLocalTree persistTaskLocal;
private PersistRemoteProfile persistTaskRemote;
@Inject
public PeriodicFileDataPersister(Provider<PersistLocalTree> localTaskProvider,
Provider<PersistRemoteProfile> remoteTaskProvider) {
this.localTaskProvider = localTaskProvider;
this.remoteTaskProvider = remoteTaskProvider;
}
/**
* Schedules persistence tasks. The tasks run periodically with a fixed delay.
*/
public void start() {
scheduler = Executors.newScheduledThreadPool(1);
persistTaskLocal = localTaskProvider.get();
persistTaskRemote = remoteTaskProvider.get();
scheduler.scheduleWithFixedDelay(persistTaskLocal,
INITIAL_DELAY, SCHEDULED_DELAY, TimeUnit.SECONDS);
scheduler.scheduleWithFixedDelay(persistTaskRemote,
INITIAL_DELAY, SCHEDULED_DELAY, TimeUnit.SECONDS);
}
/**
* Stops persistence tasks. This method may block for a short while because
* it tries to wait until running tasks complete.
*/
public void stop() {
if (scheduler != null) {
try {
scheduler.shutdown();
scheduler.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.info("Could not wait for scheduler termination (profile persistence)");
} finally {
scheduler = null;
persistTaskLocal = null;
persistTaskRemote = null;
}
}
}
}