package org.audit4j.core.schedule;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RejectedExecutionException;
/**
* Adapter that takes a JDK {@code java.util.concurrent.Executor} and exposes a
* Spring {@link org.audit4j.schedule.springframework.core.task.TaskExecutor} for it. Also
* detects an extended {@code java.util.concurrent.ExecutorService}, adapting
* the {@link org.audit4j.schedule.AsyncTaskExecutor} interface
* accordingly.
*
* @author Juergen Hoeller
* @since 3.0
* @see java.util.concurrent.Executor
* @see java.util.concurrent.ExecutorService
* @see java.util.concurrent.Executors
*/
public class TaskExecutorAdapter implements AsyncTaskExecutor {
/** The concurrent executor. */
private final Executor concurrentExecutor;
/**
* Create a new TaskExecutorAdapter, using the given JDK concurrent
* executor.
*
* @param concurrentExecutor
* the JDK concurrent executor to delegate to
*/
public TaskExecutorAdapter(Executor concurrentExecutor) {
// Assert.notNull(concurrentExecutor, "Executor must not be null");
this.concurrentExecutor = concurrentExecutor;
}
/**
* Delegates to the specified JDK concurrent executor.
*
* @param task the task
* @see java.util.concurrent.Executor#execute(Runnable)
*/
@Override
public void execute(Runnable task) {
try {
this.concurrentExecutor.execute(task);
} catch (RejectedExecutionException ex) {
throw new TaskRejectedException("Executor [" + this.concurrentExecutor + "] did not accept task: " + task,
ex);
}
}
/**
* {@inheritDoc}
*
* @see org.audit4j.core.schedule.AsyncTaskExecutor#execute(java.lang.Runnable, long)
*
*/
@Override
public void execute(Runnable task, long startTimeout) {
execute(task);
}
/**
* {@inheritDoc}
*
* @see org.audit4j.core.schedule.AsyncTaskExecutor#submit(java.lang.Runnable)
*
*/
@Override
public Future<?> submit(Runnable task) {
try {
if (this.concurrentExecutor instanceof ExecutorService) {
return ((ExecutorService) this.concurrentExecutor).submit(task);
} else {
FutureTask<Object> future = new FutureTask<Object>(task, null);
this.concurrentExecutor.execute(future);
return future;
}
} catch (RejectedExecutionException ex) {
throw new TaskRejectedException("Executor [" + this.concurrentExecutor + "] did not accept task: " + task,
ex);
}
}
/**
* {@inheritDoc}
*
* @see org.audit4j.core.schedule.AsyncTaskExecutor#submit(java.util.concurrent.Callable)
*
*/
@Override
public <T> Future<T> submit(Callable<T> task) {
try {
if (this.concurrentExecutor instanceof ExecutorService) {
return ((ExecutorService) this.concurrentExecutor).submit(task);
} else {
FutureTask<T> future = new FutureTask<T>(task);
this.concurrentExecutor.execute(future);
return future;
}
} catch (RejectedExecutionException ex) {
throw new TaskRejectedException("Executor [" + this.concurrentExecutor + "] did not accept task: " + task,
ex);
}
}
}