Java Code Examples for com.google.common.util.concurrent.ListenableFuture#cancel()
The following examples show how to use
com.google.common.util.concurrent.ListenableFuture#cancel() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Util.java From jetcd with Apache License 2.0 | 6 votes |
/** * convert ListenableFuture of Type S to CompletableFuture of Type T. */ static <S, T> CompletableFuture<T> toCompletableFuture(ListenableFuture<S> sourceFuture, Function<S, T> resultConvert, Executor executor) { CompletableFuture<T> targetFuture = new CompletableFuture<T>() { // the cancel of targetFuture also cancels the sourceFuture. @Override public boolean cancel(boolean mayInterruptIfRunning) { super.cancel(mayInterruptIfRunning); return sourceFuture.cancel(mayInterruptIfRunning); } }; sourceFuture.addListener(() -> { try { targetFuture.complete(resultConvert.apply(sourceFuture.get())); } catch (Exception e) { targetFuture.completeExceptionally(toEtcdException(e)); } }, executor); return targetFuture; }
Example 2
Source File: COSBlockOutputStream.java From stocator with Apache License 2.0 | 6 votes |
/** * Block awaiting all outstanding uploads to complete. * * @return list of results * @throws IOException IO Problems */ private List<PartETag> waitForAllPartUploads() throws IOException { LOG.debug("Waiting for {} uploads to complete", partETagsFutures.size()); try { return Futures.allAsList(partETagsFutures).get(); } catch (InterruptedException ie) { LOG.warn("Interrupted partUpload", ie); Thread.currentThread().interrupt(); return null; } catch (ExecutionException ee) { // there is no way of recovering so abort // cancel all partUploads LOG.debug("While waiting for upload completion", ee); LOG.debug("Cancelling futures"); for (ListenableFuture<PartETag> future : partETagsFutures) { future.cancel(true); } // abort multipartupload abort(); throw extractException("Multi-part upload with id '" + uploadId + "' to " + key, key, ee); } }
Example 3
Source File: TestMemoryPools.java From presto with Apache License 2.0 | 6 votes |
@Test public void testMemoryFutureCancellation() { setUpCountStarFromOrdersWithJoin(); ListenableFuture<?> future = userPool.reserve(fakeQueryId, "test", TEN_MEGABYTES.toBytes()); assertTrue(!future.isDone()); try { future.cancel(true); fail("cancel should fail"); } catch (UnsupportedOperationException e) { assertEquals(e.getMessage(), "cancellation is not supported"); } userPool.free(fakeQueryId, "test", TEN_MEGABYTES.toBytes()); assertTrue(future.isDone()); }
Example 4
Source File: TestStateMachine.java From presto with Apache License 2.0 | 6 votes |
private static void assertNoStateChange(StateMachine<State> stateMachine, StateChanger stateChange) { State initialState = stateMachine.get(); ListenableFuture<State> futureChange = stateMachine.getStateChange(initialState); SettableFuture<State> listenerChange = addTestListener(stateMachine); // listeners should not be added if we are in a terminal state, but listener should fire boolean isTerminalState = stateMachine.isTerminalState(initialState); if (isTerminalState) { assertEquals(stateMachine.getStateChangeListeners(), ImmutableSet.of()); } stateChange.run(); assertEquals(stateMachine.get(), initialState); // the future change will trigger if the state machine is in a terminal state // this is to prevent waiting for state changes that will never occur assertEquals(futureChange.isDone(), isTerminalState); futureChange.cancel(true); // test listener future only completes if the state actually changed assertFalse(listenerChange.isDone()); listenerChange.cancel(true); }
Example 5
Source File: HttpAssertsTest.java From brooklyn-server with Apache License 2.0 | 6 votes |
@Test(expectedExceptions = ExecutionException.class) public void shouldAssertAsyncHttpStatusCodeContinuallyEqualsFails() throws Exception { stopServer(); ListeningExecutorService listeningExecutor = MoreExecutors.listeningDecorator(executor); final ListenableFuture<?> future = HttpAsserts.assertAsyncHttpStatusCodeContinuallyEquals(listeningExecutor, testUri("/missing"), 200); startAfter(DELAY_FOR_SERVER_TO_SETTLE.add(Duration.seconds(1))); Time.sleep(DELAY_FOR_SERVER_TO_SETTLE); if (future.isDone()) { Object result = future.get(); // should throw exception LOG.warn("Should have failed, instead gave "+result+" (accessing "+server+")"); } else { LOG.warn("Future should have been done"); } future.cancel(true); }
Example 6
Source File: ConcurrencyLimitServerInterceptorTest.java From concurrency-limits with Apache License 2.0 | 6 votes |
@Test public void releaseOnCancellation() { // Setup server startServer((req, observer) -> { Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); observer.onNext("delayed_response"); observer.onCompleted(); }); ListenableFuture<String> future = ClientCalls.futureUnaryCall(channel.newCall(METHOD_DESCRIPTOR, CallOptions.DEFAULT), "foo"); Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); future.cancel(true); // Verify Mockito.verify(limiter, Mockito.times(1)).acquire(Mockito.isA(GrpcServerRequestContext.class)); Mockito.verify(listener.getResult().get(), Mockito.times(0)).onIgnore(); Mockito.verify(listener.getResult().get(), Mockito.timeout(2000).times(1)).onSuccess(); verifyCounts(0, 0, 1, 0); }
Example 7
Source File: S3AFastOutputStream.java From hadoop with Apache License 2.0 | 6 votes |
public List<PartETag> waitForAllPartUploads() throws IOException { try { return Futures.allAsList(partETagsFutures).get(); } catch (InterruptedException ie) { LOG.warn("Interrupted partUpload:" + ie, ie); Thread.currentThread().interrupt(); } catch (ExecutionException ee) { //there is no way of recovering so abort //cancel all partUploads for (ListenableFuture<PartETag> future : partETagsFutures) { future.cancel(true); } //abort multipartupload this.abort(); throw new IOException("Part upload failed in multi-part upload with " + "id '" +uploadId + "':" + ee, ee); } //should not happen? return null; }
Example 8
Source File: TitusClientImpl.java From titus-control-plane with Apache License 2.0 | 6 votes |
private <T> CompletableFuture<T> toCompletableFuture(ListenableFuture<T> listenableFuture, Executor executor) { CompletableFuture<T> completableFuture = new CompletableFuture<T>() { @Override public boolean cancel(boolean mayInterruptIfRunning) { listenableFuture.cancel(mayInterruptIfRunning); return super.cancel(mayInterruptIfRunning); } }; Futures.addCallback(listenableFuture, new FutureCallback<T>() { @Override public void onSuccess(@Nullable T result) { completableFuture.complete(result); } @Override public void onFailure(Throwable t) { completableFuture.completeExceptionally(t); } }, executor); return completableFuture; }
Example 9
Source File: ProducersTest.java From dagger2-sample with Apache License 2.0 | 5 votes |
@Test public void createFutureProduced_cancelPropagatesBackwards() throws Exception { ListenableFuture<String> future = SettableFuture.create(); ListenableFuture<Produced<String>> producedFuture = Producers.createFutureProduced(future); assertThat(producedFuture.isDone()).isFalse(); producedFuture.cancel(false); assertThat(future.isCancelled()).isTrue(); }
Example 10
Source File: ParallelBuilderParticipant.java From xtext-eclipse with Eclipse Public License 2.0 | 5 votes |
private void cancelProcessing(BlockingQueue<FileSystemAccessRequest> requestQueue, Queue<ParallelBuildContext> afterGenerateQueue, ListenableFuture<?> generatorResult) { // make sure waiting put on the queue are processed by freeing space in the queue requestQueue.clear(); // stop processing of resources immediately generatorResult.cancel(true); for (ParallelBuildContext context : afterGenerateQueue) { try { getGenerator2().afterGenerate(context.resource, context.synchronousFileSystemAccess, context.getGeneratorContext()); } catch (Exception e) { logger.error("Error running afterGenerate hook", e); } } }
Example 11
Source File: HttpAssertsTest.java From brooklyn-server with Apache License 2.0 | 5 votes |
@Test public void shouldAssertAsyncHttpStatusCodeContinuallyEquals() throws Exception { stopServer(); ListeningExecutorService listeningExecutor = MoreExecutors.listeningDecorator(executor); final ListenableFuture<?> future = HttpAsserts.assertAsyncHttpStatusCodeContinuallyEquals(listeningExecutor, simpleEndpoint, 200); startAfter(DELAY_FOR_SERVER_TO_SETTLE.add(Duration.seconds(1))); if (future.isDone()) { future.get(); // should not throw exception } future.cancel(true); }
Example 12
Source File: FromCompletableFutureTest.java From grpc-java-contrib with BSD 3-Clause "New" or "Revised" License | 5 votes |
@Test public void backwardsCancelShouldWork() { CompletableFuture<String> cf = new CompletableFuture<>(); ListenableFuture<String> lf = MoreFutures.fromCompletableFuture(cf); lf.cancel(true); assertThat(cf.isDone()).isTrue(); assertThat(cf.isCancelled()).isTrue(); }
Example 13
Source File: HelloClient.java From apm-agent-java with Apache License 2.0 | 5 votes |
/** * Asynchronous hello * * @param user user name * @param depth depth of nested calls, {@literal 0} for simple calls, use positive value for nesting * @return an hello statement */ public final Future<String> saysHelloAsync(String user, int depth) { Req request = buildRequest(user, depth); ListenableFuture<Rep> future = executeAsync(request); return new Future<>() { @Override public boolean cancel(boolean mayInterruptIfRunning) { return future.cancel(mayInterruptIfRunning); } @Override public boolean isCancelled() { return future.isCancelled(); } @Override public boolean isDone() { return future.isDone(); } @Override public String get() throws InterruptedException, ExecutionException { // TODO : check if something is thrown when there is a server error return getResponseMessage(future.get()); } @Override public String get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { // TODO : check if something is thrown when there is a server error return getResponseMessage(future.get(timeout, unit)); } }; }
Example 14
Source File: DefaultFutureAttributeMap.java From arcusplatform with Apache License 2.0 | 5 votes |
@Override public boolean cancel(boolean mayInterruptIfRunning) { for(ListenableFuture<?> l: this.delegate.values()) { l.cancel(mayInterruptIfRunning); } return this.results.cancel(mayInterruptIfRunning); }
Example 15
Source File: ClientCallsTest.java From grpc-nebula-java with Apache License 2.0 | 5 votes |
@Test public void unaryFutureCallCancelled() throws Exception { final AtomicReference<ClientCall.Listener<String>> listener = new AtomicReference<ClientCall.Listener<String>>(); final AtomicReference<String> cancelMessage = new AtomicReference<String>(); final AtomicReference<Throwable> cancelCause = new AtomicReference<Throwable>(); NoopClientCall<Integer, String> call = new NoopClientCall<Integer, String>() { @Override public void start(io.grpc.ClientCall.Listener<String> responseListener, Metadata headers) { listener.set(responseListener); } @Override public void cancel(String message, Throwable cause) { cancelMessage.set(message); cancelCause.set(cause); } }; Integer req = 2; ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req); future.cancel(true); assertEquals("GrpcFuture was cancelled", cancelMessage.get()); assertNull(cancelCause.get()); listener.get().onMessage("bar"); listener.get().onClose(Status.OK, new Metadata()); try { future.get(); fail("Should fail"); } catch (CancellationException e) { // Exepcted } }
Example 16
Source File: ProducersTest.java From dagger2-sample with Apache License 2.0 | 5 votes |
@Test public void createFutureProduced_cancelDoesNotPropagateForwards() throws Exception { ListenableFuture<String> future = SettableFuture.create(); ListenableFuture<Produced<String>> producedFuture = Producers.createFutureProduced(future); assertThat(producedFuture.isDone()).isFalse(); future.cancel(false); assertThat(producedFuture.isCancelled()).isFalse(); assertThat(getProducedException(producedFuture.get()).getCause()) .isInstanceOf(CancellationException.class); }
Example 17
Source File: TimeoutFuture.java From hadoop-ozone with Apache License 2.0 | 5 votes |
@Override public void run() { // If either of these reads return null then we must be after a // successful cancel or another call to this method. TimeoutFuture<V> timeoutFuture = timeoutFutureRef; if (timeoutFuture == null) { return; } ListenableFuture<V> delegate = timeoutFuture.delegateRef; if (delegate == null) { return; } /* * If we're about to complete the TimeoutFuture, we want to release our * reference to it. Otherwise, we'll pin it (and its result) in memory * until the timeout task is GCed. (The need to clear our reference to * the TimeoutFuture is the reason we use a *static* nested class with * a manual reference back to the "containing" class.) * * This has the nice-ish side effect of limiting reentrancy: run() calls * timeoutFuture.setException() calls run(). That reentrancy would * already be harmless, since timeoutFuture can be set (and delegate * cancelled) only once. (And "set only once" is important for other * reasons: run() can still be invoked concurrently in different threads, * even with the above null checks.) */ timeoutFutureRef = null; if (delegate.isDone()) { timeoutFuture.setFuture(delegate); } else { try { timeoutFuture.setException( new TimeoutException("Future timed out: " + delegate)); } finally { delegate.cancel(true); } } }
Example 18
Source File: EspressoRemoteTest.java From android-test with Apache License 2.0 | 4 votes |
@Test public void verifyInterruptedRequest_followsUpWithEmptyRequest() { final EspressoRemote espressoRemote = new EspressoRemote(mockedInstrumentation); espressoRemote.init(); final CountDownLatch espressoRequestLatch = new CountDownLatch(1); final CountDownLatch emptyRequestLatch = new CountDownLatch(1); // create a tmp handler to receive a response from the EspressoRemote under test final HandlerThread handlerThread = new HandlerThread("OtherEspresso"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case EspressoRemote.MSG_HANDLE_ESPRESSO_REQUEST: espressoRequestLatch.countDown(); break; case EspressoRemote.MSG_HANDLE_EMPTY_REQUEST: emptyRequestLatch.countDown(); break; default: super.handleMessage(msg); } } }; // create a tmp messenger to represent "other" remote Espresso Messenger otherEspressoMessenger = new Messenger(handler); Set<Messenger> clients = new HashSet<>(); clients.add(otherEspressoMessenger); clients.add(espressoRemote.incomingHandler.messengerHandler); when(mockedInstrumentation.getClientsForType(EspressoRemote.TYPE)).thenReturn(clients); // send out an interaction request to remote espresso ListenableFuture<Void> future = remoteExecutor.submit( espressoRemote.createRemoteCheckCallable( RootMatchers.DEFAULT, withId(123), null, matches(withText(is("test"))))); try { // wait until remote Espresso receives an interaction request assertTrue(espressoRequestLatch.await(200, TimeUnit.MILLISECONDS)); // interrupt the remote interaction request future.cancel(true); // ensure extra empty message was sent out to flush out the remote instance handler queue assertTrue(emptyRequestLatch.await(200, TimeUnit.MILLISECONDS)); } catch (InterruptedException e) { fail("Unexpected InterruptedException"); } // clean up handlerThread.getLooper().quit(); }
Example 19
Source File: AbstractFuture.java From hadoop-ozone with Apache License 2.0 | 4 votes |
/** * Sets the result of this {@code Future} to match the supplied input * {@code Future} once the supplied {@code Future} is done, unless this * {@code Future} has already been cancelled or set (including "set * asynchronously," defined below). * <p> * <p>If the supplied future is {@linkplain #isDone done} when this method * is called and the call is accepted, then this future is guaranteed to * have been completed with the supplied future by the time this method * returns. If the supplied future is not done and the call is accepted, then * the future will be <i>set asynchronously</i>. Note that such a result, * though not yet known, cannot be overridden by a call to a {@code set*} * method, only by a call to {@link #cancel}. * <p> * <p>If the call {@code setFuture(delegate)} is accepted and this {@code * Future} is later cancelled, cancellation will be propagated to {@code * delegate}. Additionally, any call to {@code setFuture} after any * cancellation will propagate cancellation to the supplied {@code Future}. * * @param future the future to delegate to * @return true if the attempt was accepted, indicating that the {@code * Future} was not previously cancelled or set. * @since 19.0 */ @Beta @SuppressWarnings("deadstore") protected boolean setFuture(ListenableFuture<? extends V> future) { checkNotNull(future); Object localValue = value; if (localValue == null) { if (future.isDone()) { Object val = getFutureValue(future); if (ATOMIC_HELPER.casValue(this, null, val)) { complete(this); return true; } return false; } SetFuture valueToSet = new SetFuture<V>(this, future); if (ATOMIC_HELPER.casValue(this, null, valueToSet)) { // the listener is responsible for calling completeWithFuture, // directExecutor is appropriate since all we are doing is unpacking // a completed future which should be fast. try { future.addListener(valueToSet, directExecutor()); } catch (Throwable t) { // addListener has thrown an exception! SetFuture.run can't throw // any exceptions so this must have been caused by addListener // itself. The most likely explanation is a misconfigured mock. Try // to switch to Failure. Failure failure; try { failure = new Failure(t); } catch (Throwable oomMostLikely) { failure = Failure.FALLBACK_INSTANCE; } // Note: The only way this CAS could fail is if cancel() has raced // with us. That is ok. boolean unused = ATOMIC_HELPER.casValue(this, valueToSet, failure); } return true; } localValue = value; // we lost the cas, fall through and maybe cancel } // The future has already been set to something. If it is cancellation we // should cancel the incoming future. if (localValue instanceof Cancellation) { // we don't care if it fails, this is best-effort. future.cancel(((Cancellation) localValue).wasInterrupted); } return false; }
Example 20
Source File: AbstractFuture.java From hadoop-ozone with Apache License 2.0 | 4 votes |
/** * {@inheritDoc} * <p> * <p>If a cancellation attempt succeeds on a {@code Future} that had * previously been {@linkplain#setFuture set asynchronously}, then the * cancellation will also be propagated to the delegate {@code Future} that * was supplied in the {@code setFuture} call. */ @Override public boolean cancel(boolean mayInterruptIfRunning) { Object localValue = value; boolean rValue = false; if (localValue == null | localValue instanceof SetFuture) { // Try to delay allocating the exception. At this point we may still // lose the CAS, but it is certainly less likely. Throwable cause = GENERATE_CANCELLATION_CAUSES ? new CancellationException("Future.cancel() was called.") : null; Object valueToSet = new Cancellation(mayInterruptIfRunning, cause); AbstractFuture<?> abstractFuture = this; while (true) { if (ATOMIC_HELPER.casValue(abstractFuture, localValue, valueToSet)) { rValue = true; // We call interuptTask before calling complete(), which is // consistent with FutureTask if (mayInterruptIfRunning) { abstractFuture.interruptTask(); } complete(abstractFuture); if (localValue instanceof SetFuture) { // propagate cancellation to the future set in setfuture, this is // racy, and we don't care if we are successful or not. ListenableFuture<?> futureToPropagateTo = ((SetFuture) localValue) .future; if (futureToPropagateTo instanceof TrustedFuture) { // If the future is a TrustedFuture then we specifically avoid // calling cancel() this has 2 benefits // 1. for long chains of futures strung together with setFuture // we consume less stack // 2. we avoid allocating Cancellation objects at every level of // the cancellation chain // We can only do this for TrustedFuture, because // TrustedFuture.cancel is final and does nothing but delegate // to this method. AbstractFuture<?> trusted = (AbstractFuture<?>) futureToPropagateTo; localValue = trusted.value; if (localValue == null | localValue instanceof SetFuture) { abstractFuture = trusted; continue; // loop back up and try to complete the new future } } else { // not a TrustedFuture, call cancel directly. futureToPropagateTo.cancel(mayInterruptIfRunning); } } break; } // obj changed, reread localValue = abstractFuture.value; if (!(localValue instanceof SetFuture)) { // obj cannot be null at this point, because value can only change // from null to non-null. So if value changed (and it did since we // lost the CAS), then it cannot be null and since it isn't a // SetFuture, then the future must be done and we should exit the loop break; } } } return rValue; }