/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pieShare.pieTools.pieUtilities.service.pieExecutorService;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.Validate;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.IExecutorService;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.IPieCallable;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.IPieExecutorTaskFactory;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.event.IPieEvent;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.task.IPieEventTask;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.task.IPieTask;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.exception.PieExecutorTaskFactoryException;
import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger;
import org.pieShare.pieTools.pieUtilities.service.shutDownService.api.IShutdownableService;
/**
*
* @author Svetoslav
*/
public class PieExecutorService extends ThreadPoolExecutor implements IExecutorService, IShutdownableService {
public static PieExecutorService newCachedPieExecutorService() {
return new PieExecutorService(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
}
//private ExecutorService executor;
private IPieExecutorTaskFactory executorFactory;
public PieExecutorService(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public PieExecutorService(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}
public PieExecutorService(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}
public PieExecutorService(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
/*public void setExecutor(ExecutorService executor) {
this.executor = executor;
}*/
public void setExecutorFactory(IPieExecutorTaskFactory executorFactory) {
this.executorFactory = executorFactory;
}
@Override
public void execute(IPieTask task) {
Validate.notNull(task);
try{
PieLogger.trace(this.getClass(), "Executing {}", task);
super.execute(task);
//this.executor.execute(task);
}
catch(NullPointerException ex) {
PieLogger.info(this.getClass(), "Exception in PieExecutorService!", ex);
}
}
@Override
public void handlePieEvent(IPieEvent event) throws PieExecutorTaskFactoryException {
IPieEventTask task = this.executorFactory.getTask(event);
this.execute(task);
}
@Override
public void shutdown() {
super.shutdown();
//this.executor.shutdown();
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if(t != null) {
PieLogger.error(this.getClass(), "Error in task!", t);
}
if(r instanceof Future<?>){
try {
Future<?> future = (Future<?>) r;
future.get();
} catch (InterruptedException ex) {
PieLogger.error(this.getClass(), "Task interrupted!", ex);
} catch (ExecutionException ex) {
PieLogger.error(this.getClass(), "Error in task!", ex);
} catch (CancellationException ex) {
PieLogger.error(this.getClass(), "Task canceled!", ex);
}
}
}
}