package org.atomnuke.fallout.service.tasker; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; import org.atomnuke.container.service.annotation.NukeBootstrap; import org.atomnuke.container.service.annotation.Requires; import org.atomnuke.fallout.service.gc.GarbageCollectionTask; import org.atomnuke.plugin.InstanceContext; 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.TaskTracker; import org.atomnuke.task.manager.Tasker; import org.atomnuke.task.manager.impl.FalloutTasker; import org.atomnuke.task.manager.impl.ThreadSafeTaskTracker; import org.atomnuke.task.manager.service.TaskingService; import org.atomnuke.util.TimeValue; import org.atomnuke.lifecycle.InitializationException; import org.atomnuke.plugin.context.LocalInstanceContext; import org.atomnuke.service.runtime.AbstractRuntimeService; import org.atomnuke.task.threading.ExecutionManager; import org.atomnuke.util.remote.AtomicCancellationRemote; import org.atomnuke.util.remote.CancellationRemote; /** * * @author zinic */ @NukeBootstrap @Requires(ReclamationHandler.class) public class FalloutTaskingBootstrapService extends AbstractRuntimeService { private static final String SERVICE_NAME = "org.atomnuke.task.manager.impl.TaskerService"; private final CancellationRemote taskTrackerCancelRemote; private final List<TaskHandle> explicitlyManagedTasks; private TaskingService taskingService; public FalloutTaskingBootstrapService() { super(TaskingService.class); taskTrackerCancelRemote = new AtomicCancellationRemote(); explicitlyManagedTasks = new LinkedList<TaskHandle>(); } @Override public String name() { return SERVICE_NAME; } @Override public Object instance() { return taskingService; } @Override public void init(ServiceContext contextObject) throws InitializationException { try { final ExecutionManager executionManager = contextObject.services().firstAvailable(ExecutionManager.class); final ReclamationHandler reclamationHandler = contextObject.services().firstAvailable(ReclamationHandler.class); final TaskTracker taskTracker = new ThreadSafeTaskTracker(taskTrackerCancelRemote); final Tasker tasker = new FalloutTasker(reclamationHandler, executionManager, taskTracker); // As the tasking service, it's our job to spin up essential polling services? final InstanceContext gcTaskCtx = new LocalInstanceContext(new GarbageCollectionTask(reclamationHandler)); // TODO: This feature should be extensible explicitlyManagedTasks.add(tasker.pollTask(gcTaskCtx, new TimeValue(15, TimeUnit.MILLISECONDS))); taskingService = new FalloutTaskingService(taskTracker, tasker); } catch (ServiceUnavailableException sue) { throw new InitializationException(sue); } } @Override public void destroy() { for (TaskHandle handle : explicitlyManagedTasks) { handle.cancellationRemote().cancel(); } explicitlyManagedTasks.clear(); taskTrackerCancelRemote.cancel(); } }