All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.infinispan.remoting.transport.AbstractRequest Maven / Gradle / Ivy

package org.infinispan.remoting.transport;

import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.infinispan.remoting.transport.impl.RequestRepository;

/**
 * A remote invocation request.
 *
 * 

Thread-safety: This class and its sub-classes are thread-safe. They use the {@code ResponseCollector}'s monitor * for synchronization, so that collectors usually don't need any explicit synchronization.

* * @author Dan Berindei * @since 9.1 */ public abstract class AbstractRequest extends CompletableFuture implements Callable, Request { protected final ResponseCollector responseCollector; protected final long requestId; protected final RequestRepository repository; private volatile Future timeoutFuture = null; protected AbstractRequest(long requestId, ResponseCollector responseCollector, RequestRepository repository) { this.responseCollector = responseCollector; this.repository = repository; this.requestId = requestId; } /** * Called when the timeout task scheduled with {@link #setTimeout(ScheduledExecutorService, long, TimeUnit)} expires. */ protected abstract void onTimeout(); @Override public final long getRequestId() { return requestId; } /** * Schedule a timeout task on the given executor, and complete the request with a {@link * org.infinispan.util.concurrent.TimeoutException} * when the task runs. * * If a timeout task was already registered with this request, it is cancelled. */ public void setTimeout(ScheduledExecutorService timeoutExecutor, long timeout, TimeUnit unit) { cancelTimeoutTask(); ScheduledFuture timeoutFuture = timeoutExecutor.schedule(this, timeout, unit); setTimeoutFuture(timeoutFuture); } public void cancel(Exception exception) { completeExceptionally(exception); } // Override complete(), completeExceptionally(), and cancel() to cancel the timeout task and remove the request from the map @Override public boolean complete(T value) { cancelTimeoutTask(); repository.removeRequest(requestId); return super.complete(value); } @Override public boolean completeExceptionally(Throwable ex) { cancelTimeoutTask(); repository.removeRequest(requestId); return super.completeExceptionally(ex); } @Override public boolean cancel(boolean mayInterruptIfRunning) { cancelTimeoutTask(); repository.removeRequest(requestId); return super.cancel(mayInterruptIfRunning); } // Implement Callable for the timeout task @Override public final Void call() throws Exception { onTimeout(); return null; } private void setTimeoutFuture(Future timeoutFuture) { this.timeoutFuture = timeoutFuture; if (isDone()) { timeoutFuture.cancel(false); } } private void cancelTimeoutTask() { if (timeoutFuture != null) { timeoutFuture.cancel(false); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy