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

com.cloudhopper.commons.util.windowing.WindowFuture Maven / Gradle / Ivy

package com.cloudhopper.commons.util.windowing;

/*
 * #%L
 * ch-commons-util
 * %%
 * Copyright (C) 2012 Cloudhopper by Twitter
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

/**
 * A {@link WindowFuture} is either uncompleted or completed.
 * When an operation begins, a new future object is created.  The new future
 * is uncompleted initially - it is neither succeeded, failed, nor cancelled
 * because the operation is not finished yet.  If the operation is
 * finished either successfully, with failure, or by cancellation, the future is
 * marked as completed with more specific information, such as the cause of the
 * failure.  Please note that even failure and cancellation belong to the
 * completed state.
 * 
 *                                      +---------------------------+
 *                                      | Completed successfully    |
 *                                      +---------------------------+
 *                                 +---->      isDone() = true      |
 * +--------------------------+    |    |   isSuccess() = true      |
 * |        Uncompleted       |    |    +===========================+
 * +--------------------------+    |    | Completed with failure    |
 * |      isDone() = false    |    |    +---------------------------+
 * |   isSuccess() = false    |----+---->   isDone() = true         |
 * | isCancelled() = false    |    |    | getCause() = non-null     |
 * |    getCause() = null     |    |    +===========================+
 * +--------------------------+    |    | Completed by cancellation |
 *                                 |    +---------------------------+
 *                                 +---->      isDone() = true      |
 *                                      | isCancelled() = true      |
 *                                      +---------------------------+
 * 
* * @author joelauer (twitter: @jjlauer or http://twitter.com/jjlauer) */ public interface WindowFuture { /** The caller is not waiting on this entry */ static public final int CALLER_NOT_WAITING = 0; /** The caller is waiting on this entry */ static public final int CALLER_WAITING = 1; /** The caller was waiting, but gave up (timeout) */ static public final int CALLER_WAITING_TIMEOUT = 2; /** * Gets the key of the window entry. * @return The key of the window entry. */ public K getKey(); /** * Gets the request contained in the window entry. * @return The request contained in the window entry. */ public R getRequest(); /** * Gets the response associated with the window entry. * @return The response associated with he request or null if no response * has been received. */ public P getResponse(); /** * Returns {@code true} if and only if this future is * complete, regardless of whether the operation was successful, failed, * or cancelled. */ public boolean isDone(); /** * Returns {@code true} if and only if the operation was completed * successfully. */ public boolean isSuccess(); /** * Returns the cause of the failed operation if the operation has * failed. * * @return the cause of the failure. * {@code null} if succeeded or this future is not * completed yet. */ public Throwable getCause(); /** * Returns {@code true} if and only if this future was cancelled by a * cancel() method. */ public boolean isCancelled(); /** * Gets a hint of the caller state such as whether the caller is waiting, not * waiting, or timed out while waiting for completion. * @return The hint of the state of the caller */ public int getCallerStateHint(); /** * Returns {@code true} if and only if the caller hinted at "WAITING" for * completion. Returns {@code false} if the caller either did not hint * at planning on "WAITING" or did wait but timed out and gave up. Please * note that even if this returns true, it does not mean the caller is * actively waiting since this merely represents a hint. */ public boolean isCallerWaiting(); /** * Returns the size of the window (number of requests in it) after this * request was added. Useful for calculating an estimated response time * just for this request. * @return The size of the window after this request was added. */ public int getWindowSize(); /** * Returns true if an expire timestamp value exists (> 0). * @return True if an expire timestamp exists */ public boolean hasExpireTimestamp(); /** * Gets the expire timestamp in milliseconds. The expire timestamp is when * the request expires unless this optional field was not set. * @return The expire timestamp or <= 0 if it doesn't exist. * @see #hasExpireTimestamp() */ public long getExpireTimestamp(); /** * Gets the offer timestamp in milliseconds. The offer timestamp is when * the request was offered for acceptance to the window. * @return The offer timestamp */ public long getOfferTimestamp(); /** * Gets the accept timestamp in milliseconds. The accept timestamp is when * the request was accepted by the window. * @return The accept timestamp */ public long getAcceptTimestamp(); /** * Gets the amount of time (in ms) from offer to accept. * @return The amount of time from offer to accept */ public long getOfferToAcceptTime(); /** * Returns true if a done timestamp value exists (> 0). * @return True if a done timestamp exists */ public boolean hasDoneTimestamp(); /** * Gets the done timestamp in milliseconds. The done timestamp is when * the request has been completed. * @return The done timestamp */ public long getDoneTimestamp(); /** * Gets the amount of time (in ms) from offer to done or -1 if a done * timestamp does not yet exist. * @return The amount of time from offer to done */ public long getOfferToDoneTime(); /** * Gets the amount of time (in ms) from accept to done or -1 if a done * timestamp does not yet exist. * @return The amount of time from accept to done */ public long getAcceptToDoneTime(); /** * Completes (as a success) a request by setting the response. This method * will set the done timestamp to System.currentTimeMillis(). * @param response The response for the associated request */ public void complete(P response); /** * Completes (as a success) a request by setting the response. * @param response The response for the associated request * @param doneTimestamp The timestamp when the request completed */ public void complete(P response, long doneTimestamp); /** * Completes (as a failure) a request by setting a throwable as the cause * of failure. This method will set the done timestamp to System.currentTimeMillis() * @param t The throwable as the cause of failure */ public void fail(Throwable t); /** * Completes (as a failure) a request by setting a throwable as the cause * of failure. * @param t The throwable as the cause of failure * @param doneTimestamp The timestamp when the request failed */ public void fail(Throwable t, long doneTimestamp); /** * Completes (as a cancel) a request. This method will set the done timestamp * to System.currentTimeMillis(). */ public void cancel(); /** * Completes (as a cancel) a request. * @param doneTimestamp The timestamp when the request was cancelled */ public void cancel(long doneTimestamp); /** * Waits for this future to be completed within the amount of time remaining * from the original offerTimeoutMillis minus the amount of time it took * for the Window to accept the offer. For example, if Window.offer was * called with an offerTimeoutMillis of 5000 milliseconds and it took * 1000 milliseconds for the Window to accept the offer, then this method * would wait for 4000 milliseconds. * @return True if and only if the future was completed within the specified * time limit * @throws InterruptedException Thrown if the current thread was interrupted */ public boolean await() throws InterruptedException; /** * Waits for this future to be completed within the specified time limit. * @param timeoutMillis The amount of milliseconds to wait * @return True if and only if the future was completed within the specified * time limit * @throws InterruptedException Thrown if the current thread was interrupted */ public boolean await(long timeoutMillis) throws InterruptedException; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy