package org.ovirt.engine.core.utils.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.interfaces.IVdcUser;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.utils.ThreadLocalParamsContainer;
public class ThreadPoolUtil {
private static LogCompat log = LogFactoryCompat.getLog(ThreadPoolUtil.class);
private static class InternalThreadExecutor extends ThreadPoolExecutor {
/**
* The pool which will be created with corePoolSize equal to ConfigValues.DefaultMinThreadPoolSize
* maximumPoolSize equal to DefaultMaxThreadPoolSize
*/
public InternalThreadExecutor() {
super(Config.<Integer> GetValue(ConfigValues.DefaultMinThreadPoolSize),
Config.<Integer> GetValue(ConfigValues.DefaultMaxThreadPoolSize),
60L,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
ThreadLocalParamsContainer.clean();
}
}
private static class InternalWrapperRunnable implements Runnable {
private Runnable job;
private IVdcUser vdcUser;
private String httpSessionId;
public InternalWrapperRunnable(Runnable job, IVdcUser vdcUser, String httpSessionId) {
this.job = job;
this.vdcUser = vdcUser;
this.httpSessionId = httpSessionId;
}
@Override
public void run() {
ThreadLocalParamsContainer.setVdcUser(vdcUser);
ThreadLocalParamsContainer.setHttpSessionId(httpSessionId);
job.run();
}
}
private static final ExecutorService es = new InternalThreadExecutor();
public static void execute(Runnable command) {
try {
es.submit(new InternalWrapperRunnable(command,
ThreadLocalParamsContainer.getVdcUser(),
ThreadLocalParamsContainer.getHttpSessionId()));
} catch (RejectedExecutionException e) {
log.warn("The thread pool is out of limit. A submitted task was rejected");
throw e;
}
}
}