package org.atomnuke.task.manager.impl; import org.atomnuke.task.atom.impl.ManagedAtomTask; import org.atomnuke.task.manager.Tasker; import org.atomnuke.sink.manager.SinkManager; import org.atomnuke.sink.manager.SinkManagerImpl; import org.atomnuke.plugin.InstanceContext; import org.atomnuke.plugin.context.LocalInstanceContext; import org.atomnuke.service.gc.ReclamationHandler; import org.atomnuke.source.AtomSource; import org.atomnuke.task.atom.AtomTask; import org.atomnuke.task.TaskHandle; import org.atomnuke.task.atom.impl.AtomTaskImpl; import org.atomnuke.task.manager.AtomTasker; import org.atomnuke.task.atom.impl.SourceManagedPollingController; import org.atomnuke.util.TimeValue; /** * * TODO: Add a polling controller interface to dynamically requeue or request sleep time per task * * @author zinic */ public class AtomTaskerImpl implements AtomTasker { private final ReclamationHandler reclamationHandler; private final Tasker tasker; public AtomTaskerImpl(ReclamationHandler reclamationHandler, Tasker tasker) { this.reclamationHandler = reclamationHandler; this.tasker = tasker; } @Override public AtomTask follow(InstanceContext<AtomSource> source, TimeValue pollingInterval) { // New Sink manager final SinkManager sinkManager = new SinkManagerImpl(reclamationHandler); // Register and track the new source final SourceManagedPollingController pollingController = new SourceManagedPollingController(pollingInterval); final ManagedAtomTask managedAtomTask = new ManagedAtomTask(pollingController, source, sinkManager, tasker); final TaskHandle newHandle = tasker.queueTask(new LocalInstanceContext(managedAtomTask), pollingController); return new AtomTaskImpl(sinkManager, newHandle); } }