/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.toolkit.modules.concurrency.internal;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncCallbackExceptionPolicy;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncOrderedCallbackManager;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncOrderedExecutionQueue;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncTaskService;
import de.rcenvironment.toolkit.modules.concurrency.api.BatchAggregator;
import de.rcenvironment.toolkit.modules.concurrency.api.BatchProcessor;
import de.rcenvironment.toolkit.modules.concurrency.api.CallablesGroup;
import de.rcenvironment.toolkit.modules.concurrency.api.ConcurrencyUtilsFactory;
import de.rcenvironment.toolkit.modules.concurrency.api.RunnablesGroup;
import de.rcenvironment.toolkit.modules.statistics.api.CounterCategory;
import de.rcenvironment.toolkit.modules.statistics.api.StatisticsFilterLevel;
import de.rcenvironment.toolkit.modules.statistics.api.StatisticsTrackerService;
/**
* {@link ConcurrencyUtilsFactory} implementation.
*
* @author Robert Mischke
*/
public final class ConcurrencyUtilsFactoryImpl implements ConcurrencyUtilsFactory {
private final AsyncTaskService asyncTaskService;
private final ConcurrencyUtilsServiceHolder internalServiceHolder;
private final CounterCategory counterCategory;
public ConcurrencyUtilsFactoryImpl(AsyncTaskService asyncTaskService, StatisticsTrackerService statisticsTrackerService) {
this.asyncTaskService = asyncTaskService;
this.internalServiceHolder = new ConcurrencyUtilsServiceHolder(asyncTaskService, statisticsTrackerService, this);
// note: the counterCategory.countStacktrace() calls below have virtually zero overhead if it is disabled by the global filter
// level; as stacktrace generation only happens after this check, no isEnabled() check is necessary around it
this.counterCategory =
statisticsTrackerService.getCounterCategory("ConcurrencyUtilsFactory requests", StatisticsFilterLevel.DEBUG);
}
@Override
public AsyncOrderedExecutionQueue createAsyncOrderedExecutionQueue(AsyncCallbackExceptionPolicy exceptionPolicy) {
counterCategory.countStacktrace();
return new AsyncOrderedExecutionQueueImpl(exceptionPolicy, internalServiceHolder);
}
@Override
public <T> AsyncOrderedCallbackManager<T> createAsyncOrderedCallbackManager(AsyncCallbackExceptionPolicy exceptionPolicy) {
counterCategory.countStacktrace();
return new AsyncOrderedCallbackManagerImpl<T>(exceptionPolicy, internalServiceHolder);
}
@Override
public <T> BatchAggregator<T> createBatchAggregator(int maxBatchSize, long maxLatency, BatchProcessor<T> processor) {
counterCategory.countStacktrace();
return new BatchAggregatorImpl<T>(maxBatchSize, maxLatency, processor, internalServiceHolder);
}
@Override
public <T> CallablesGroup<T> createCallablesGroup(Class<T> clazz) {
counterCategory.countStacktrace();
return new CallablesGroupImpl<T>(asyncTaskService);
}
@Override
public RunnablesGroup createRunnablesGroup() {
counterCategory.countStacktrace();
return new RunnablesGroupImpl(asyncTaskService);
}
}