abs.api.QueueOpener Maven / Gradle / Ivy
package abs.api;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* An implementation of opener that is used by {@link QueueInbox}.
* This implementation requires an instance of {@link ExecutorService}
* that dispatches the envelopes to be executed when their turn is
* resolved.
*
* @author Behrooz Nobakht
* @since 1.0
*/
class QueueOpener extends DefaultOpener {
private final BlockingQueue tasks;
private final EnvelopeTaskExecutor taskExecutor;
private final Runnable onEnvelopeTaskComplete;
/**
*
* Constructor for QueueOpener.
*
*
* @param tasks
* a {@link java.util.concurrent.BlockingQueue} object.
* @param executor
* a {@link java.util.concurrent.ExecutorService}
* object.
*/
public QueueOpener(BlockingQueue tasks, ExecutorService executor) {
this.tasks = tasks;
this.taskExecutor = new EnvelopeTaskExecutor(tasks, executor);
this.onEnvelopeTaskComplete = () -> {
taskExecutor.tryExecuteNext();
};
}
/** {@inheritDoc} */
@Override
protected void executeEnvelopeTask(final Runnable task) {
tasks.offer(task);
executeNext();
}
/** {@inheritDoc} */
@Override
protected Runnable createEnvelopeTask(Envelope envelope, Object target) {
final Runnable task = super.createEnvelopeTask(envelope, target);
final Callable