package de.invesdwin.util.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe
public class WrappedScheduledExecutorService extends WrappedExecutorService implements ScheduledExecutorService {
WrappedScheduledExecutorService(final java.util.concurrent.ScheduledThreadPoolExecutor delegate,
final String name) {
super(delegate, name);
withLogExceptions(true);
}
@Override
public java.util.concurrent.ScheduledThreadPoolExecutor getWrappedInstance() {
return (java.util.concurrent.ScheduledThreadPoolExecutor) super.getWrappedInstance();
}
@Override
public ScheduledFuture<?> schedule(final Runnable command, final long delay, final TimeUnit unit) {
try {
return getWrappedInstance().schedule(WrappedRunnable.newInstance(this, command), delay, unit);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
return new InterruptingFuture<Object>();
}
}
@Override
public <V> ScheduledFuture<V> schedule(final Callable<V> callable, final long delay, final TimeUnit unit) {
try {
return getWrappedInstance().schedule(WrappedCallable.newInstance(this, callable), delay, unit);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
return new InterruptingFuture<V>();
}
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(final Runnable command, final long initialDelay, final long period,
final TimeUnit unit) {
try {
return getWrappedInstance().scheduleAtFixedRate(WrappedRunnable.newInstance(this, command), initialDelay,
period, unit);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
return new InterruptingFuture<Object>();
}
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(final Runnable command, final long initialDelay, final long delay,
final TimeUnit unit) {
try {
return getWrappedInstance().scheduleWithFixedDelay(WrappedRunnable.newInstance(this, command), initialDelay,
delay, unit);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
return new InterruptingFuture<Object>();
}
}
}