package com.mongodb.hvdf.async;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.mongodb.hvdf.services.AsyncService;
public class AsyncTaskExecutor
extends ThreadPoolExecutor
implements RejectedExecutionHandler {
private static final long THREAD_TIMEOUT = Long.MAX_VALUE;
private final AsyncService owner;
public AsyncTaskExecutor(
AsyncService owner,
int corePoolSize,
int maximumPoolSize,
BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, THREAD_TIMEOUT, TimeUnit.SECONDS, workQueue);
this.setRejectedExecutionHandler(this);
this.owner = owner;
}
@Override
public void afterExecute(Runnable r, Throwable t) {
RecoverableAsyncTask task = (RecoverableAsyncTask) r;
if(t == null){
this.owner.taskComplete(task);
} else {
this.owner.taskFailed(task, t);
}
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
RecoverableAsyncTask task = (RecoverableAsyncTask) r;
this.owner.taskRejected(task);
}
}