package org.atomnuke.container.service.config;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.atomnuke.container.service.annotation.NukeService;
import org.atomnuke.container.service.annotation.Requires;
import org.atomnuke.service.ServiceUnavailableException;
import org.atomnuke.service.ServiceContext;
import org.atomnuke.service.gc.ReclamationHandler;
import org.atomnuke.task.TaskHandle;
import org.atomnuke.task.manager.service.TaskingService;
import org.atomnuke.util.TimeValue;
import org.atomnuke.util.config.update.ConfigurationUpdateService;
import org.atomnuke.util.config.update.ConfigurationUpdateManagerImpl;
import org.atomnuke.lifecycle.InitializationException;
import org.atomnuke.plugin.context.LocalInstanceContext;
import org.atomnuke.service.runtime.AbstractRuntimeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author zinic
*/
@NukeService
@Requires({ReclamationHandler.class, TaskingService.class})
public class ConfigurationService extends AbstractRuntimeService {
public static final String CFG_POLLER_PROPERTY_KEY = "org.atomnuke.container.service.config.ConfigurationService.poll_interval_ms";
private static final TimeValue DEFAULT_POLL_INTERVAL = new TimeValue(15, TimeUnit.SECONDS);
private static final Logger LOG = LoggerFactory.getLogger(ConfigurationService.class);
private ConfigurationUpdateService cfgUpdateMangaer;
private TaskHandle cfgPollerHandle;
public ConfigurationService() {
super(ConfigurationUpdateService.class);
}
@Override
public Object instance() {
return cfgUpdateMangaer;
}
private static TimeValue pollerTime(Map<String, String> parameters) {
TimeValue pollerTime = DEFAULT_POLL_INTERVAL;
if (parameters.containsKey(CFG_POLLER_PROPERTY_KEY)) {
final String configuredPollTime = parameters.get(CFG_POLLER_PROPERTY_KEY);
try {
pollerTime = new TimeValue(Long.parseLong(configuredPollTime), TimeUnit.MILLISECONDS);
} catch (NumberFormatException nfe) {
LOG.error("Value: " + configuredPollTime + " is not a valid number. The configuration poller accepts time periods in ms.", nfe);
}
}
return pollerTime;
}
@Override
public void init(ServiceContext sc) throws InitializationException {
LOG.info("Nuke configuration poller starting.");
final TimeValue pollerTime = pollerTime(sc.parameters());
try {
final ReclamationHandler reclamationHandler = sc.services().firstAvailable(ReclamationHandler.class);
final TaskingService taskingModule = sc.services().firstAvailable(TaskingService.class);
cfgUpdateMangaer = new ConfigurationUpdateManagerImpl(reclamationHandler);
cfgPollerHandle = taskingModule.tasker().pollTask(new LocalInstanceContext(new ConfigurationUpdateRunnable(cfgUpdateMangaer)), pollerTime);
} catch (ServiceUnavailableException sue) {
throw new InitializationException(sue);
}
}
@Override
public void destroy() {
LOG.info("Nuke configuration poller stopping.");
cfgPollerHandle.cancellationRemote().cancel();
}
}