package com.emc.storageos.coordinator.client.service.impl;
import com.emc.storageos.services.util.NamedThreadPoolExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ThreadPoolExecutor;
/**
* Asynchronously consumes tasks from a {@link com.emc.storageos.coordinator.client.service.DistributedLockQueueManager}
* using a managed thread pool.
*
* @author Ian Bibby
*/
public abstract class DistributedLockQueueTaskConsumer<T> {
private static final Logger log = LoggerFactory.getLogger(DistributedLockQueueTaskConsumer.class);
private static final int DEFAULT_THREADS = 10;
private ThreadPoolExecutor consumers;
public void start() {
consumers = new NamedThreadPoolExecutor("DLQTaskConsumers", DEFAULT_THREADS);
}
public void stop() {
consumers.shutdownNow();
}
public void startConsumeTask(final T task, final DistributedLockQueueTaskConsumerCallback callback) {
try {
consumers.execute(new Runnable() {
@Override
public void run() {
consumeTask(task, callback);
}
});
} catch (Exception e) {
log.error("Failed to consume task", e);
}
}
public abstract void consumeTask(T task, DistributedLockQueueTaskConsumerCallback callback);
}