Java Code Examples for java.util.concurrent.CompletableFuture#exceptionally()

The following examples show how to use java.util.concurrent.CompletableFuture#exceptionally() . 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: OrderedCompletableFutureTest.java    From copycat with Apache License 2.0 6 votes vote down vote up
/**
 * Tests ordered failure of future callbacks.
 */
public void testOrderedFailure() throws Throwable {
  CompletableFuture<String> future = new OrderedCompletableFuture<>();
  AtomicInteger order = new AtomicInteger();
  future.whenComplete((r, e) -> assertEquals(1, order.incrementAndGet()));
  future.whenComplete((r, e) -> assertEquals(2, order.incrementAndGet()));
  future.handle((r, e) -> {
    assertEquals(3, order.incrementAndGet());
    return "bar";
  });
  future.thenRun(() -> fail());
  future.thenAccept(r -> fail());
  future.exceptionally(e -> {
    assertEquals(3, order.incrementAndGet());
    return "bar";
  });
  future.completeExceptionally(new RuntimeException("foo"));
}
 
Example 2
Source File: SimpleReactStream.java    From cyclops with Apache License 2.0 6 votes vote down vote up
/**
 * @param collector
 *            to perform aggregation / reduction operation on the results
 *            from active stage (e.g. to Collect into a List or String)
 * @param fn
 *            Function that receives the results of all currently active
 *            tasks as input
 * @return A new builder object that can be used to define the next stage in
 *         the dataflow
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
default <R1, R2> SimpleReactStream<R2> allOf(final Collector<? super U, ?, R1> collector, final Function<? super R1, ? extends R2> fn) {

    final CompletableFuture[] array = lastActiveArray(getLastActive());
    final CompletableFuture cf = CompletableFuture.allOf(array);
    final Function<Exception, R2> f = (final Exception e) -> {
        BlockingStreamHelper.capture(e, getErrorHandler());
        return BlockingStreamHelper.block(this, Collectors.toList(), new EagerStreamWrapper(
                                                                                            Stream.of(array), getErrorHandler()));
    };
    final CompletableFuture onFail = cf.exceptionally(f);
    final CompletableFuture onSuccess = onFail.thenApplyAsync((result) -> {
        return new StageWithResults(
                                    getTaskExecutor(), null,
                                    result).submit(() -> fn.apply(BlockingStreamHelper.aggregateResultsCompletable(collector, Stream.of(array)
                                                                                                                                    .collect(Collectors.toList()),
                                                                                                                   getErrorHandler())));
    } , getTaskExecutor());
    return (SimpleReactStream<R2>) withLastActive(new EagerStreamWrapper(
                                                                         onSuccess, getErrorHandler()));

}
 
Example 3
Source File: Dispatcher.java    From Flink-CEPplus with Apache License 2.0 6 votes vote down vote up
@Override
public CompletableFuture<ArchivedExecutionGraph> requestJob(JobID jobId, Time timeout) {
	final CompletableFuture<JobMasterGateway> jobMasterGatewayFuture = getJobMasterGatewayFuture(jobId);

	final CompletableFuture<ArchivedExecutionGraph> archivedExecutionGraphFuture = jobMasterGatewayFuture.thenCompose(
		(JobMasterGateway jobMasterGateway) -> jobMasterGateway.requestJob(timeout));

	return archivedExecutionGraphFuture.exceptionally(
		(Throwable throwable) -> {
			final ArchivedExecutionGraph serializableExecutionGraph = archivedExecutionGraphStore.get(jobId);

			// check whether it is a completed job
			if (serializableExecutionGraph == null) {
				throw new CompletionException(ExceptionUtils.stripCompletionException(throwable));
			} else {
				return serializableExecutionGraph;
			}
		});
}
 
Example 4
Source File: Execution.java    From Flink-CEPplus with Apache License 2.0 6 votes vote down vote up
/**
 * Sends stop RPC call.
 */
public void stop() {
	assertRunningInJobMasterMainThread();
	final LogicalSlot slot = assignedResource;

	if (slot != null) {
		final TaskManagerGateway taskManagerGateway = slot.getTaskManagerGateway();

		CompletableFuture<Acknowledge> stopResultFuture = FutureUtils.retry(
			() -> taskManagerGateway.stopTask(attemptId, rpcTimeout),
			NUM_STOP_CALL_TRIES,
			vertex.getExecutionGraph().getJobMasterMainThreadExecutor());

		stopResultFuture.exceptionally(
			failure -> {
				LOG.info("Stopping task was not successful.", failure);
				return null;
			});
	}
}
 
Example 5
Source File: ToCompletableFutureTest.java    From grpc-java-contrib with BSD 3-Clause "New" or "Revised" License 6 votes vote down vote up
@Test
public void forwardExceptionShouldPropagate() throws Exception {
    final String value = UUID.randomUUID().toString();

    SettableFuture<String> lf = SettableFuture.create();
    CompletableFuture<String> cf = MoreFutures.toCompletableFuture(lf);

    Exception intentionalException = new IntentionalException();
    final AtomicReference<Throwable> foundException = new AtomicReference<>();

    cf = cf.exceptionally(ex -> {
        foundException.set(ex);
        return value;
    });

    lf.setException(intentionalException);

    assertThat(cf).isDone();
    assertThat(cf).isNotCancelled();
    assertThat(cf).isNotCompletedExceptionally();

    assertThat(cf).isCompletedWithValue(value);
    assertThat(foundException.get()).isSameAs(intentionalException);
}
 
Example 6
Source File: Dispatcher.java    From flink with Apache License 2.0 6 votes vote down vote up
@Override
public CompletableFuture<JobStatus> requestJobStatus(JobID jobId, Time timeout) {

	final CompletableFuture<JobMasterGateway> jobMasterGatewayFuture = getJobMasterGatewayFuture(jobId);

	final CompletableFuture<JobStatus> jobStatusFuture = jobMasterGatewayFuture.thenCompose(
		(JobMasterGateway jobMasterGateway) -> jobMasterGateway.requestJobStatus(timeout));

	return jobStatusFuture.exceptionally(
		(Throwable throwable) -> {
			final JobDetails jobDetails = archivedExecutionGraphStore.getAvailableJobDetails(jobId);

			// check whether it is a completed job
			if (jobDetails == null) {
				throw new CompletionException(ExceptionUtils.stripCompletionException(throwable));
			} else {
				return jobDetails.getStatus();
			}
		});
}
 
Example 7
Source File: GuildImpl.java    From JDA with Apache License 2.0 6 votes vote down vote up
@Nonnull
@Override
@CheckReturnValue
public Task<List<Member>> retrieveMembersByPrefix(@Nonnull String prefix, int limit)
{
    Checks.notEmpty(prefix, "Prefix");
    Checks.positive(limit, "Limit");
    Checks.check(limit <= 100, "Limit must not be greater than 100");
    MemberChunkManager chunkManager = api.getClient().getChunkManager();

    List<Member> collect = new ArrayList<>(limit);
    CompletableFuture<List<Member>> result = new CompletableFuture<>();
    CompletableFuture<Void> handle = chunkManager.chunkGuild(this, prefix, limit, (last, list) -> {
        collect.addAll(list);
        if (last)
            result.complete(collect);
    });

    result.exceptionally(ex -> {
        WebSocketClient.LOG.error("Encountered exception trying to handle member chunk response", ex);
        return null;
    });

    return new GatewayTask<>(result, () -> handle.cancel(false));
}
 
Example 8
Source File: Dispatcher.java    From flink with Apache License 2.0 6 votes vote down vote up
@Override
public CompletableFuture<ArchivedExecutionGraph> requestJob(JobID jobId, Time timeout) {
	final CompletableFuture<JobMasterGateway> jobMasterGatewayFuture = getJobMasterGatewayFuture(jobId);

	final CompletableFuture<ArchivedExecutionGraph> archivedExecutionGraphFuture = jobMasterGatewayFuture.thenCompose(
		(JobMasterGateway jobMasterGateway) -> jobMasterGateway.requestJob(timeout));

	return archivedExecutionGraphFuture.exceptionally(
		(Throwable throwable) -> {
			final ArchivedExecutionGraph serializableExecutionGraph = archivedExecutionGraphStore.get(jobId);

			// check whether it is a completed job
			if (serializableExecutionGraph == null) {
				throw new CompletionException(ExceptionUtils.stripCompletionException(throwable));
			} else {
				return serializableExecutionGraph;
			}
		});
}
 
Example 9
Source File: Dispatcher.java    From flink with Apache License 2.0 6 votes vote down vote up
@Override
public CompletableFuture<JobStatus> requestJobStatus(JobID jobId, Time timeout) {

	final CompletableFuture<JobMasterGateway> jobMasterGatewayFuture = getJobMasterGatewayFuture(jobId);

	final CompletableFuture<JobStatus> jobStatusFuture = jobMasterGatewayFuture.thenCompose(
		(JobMasterGateway jobMasterGateway) -> jobMasterGateway.requestJobStatus(timeout));

	return jobStatusFuture.exceptionally(
		(Throwable throwable) -> {
			final JobDetails jobDetails = archivedExecutionGraphStore.getAvailableJobDetails(jobId);

			// check whether it is a completed job
			if (jobDetails == null) {
				throw new CompletionException(ExceptionUtils.stripCompletionException(throwable));
			} else {
				return jobDetails.getStatus();
			}
		});
}
 
Example 10
Source File: WorldStateDownloadProcess.java    From besu with Apache License 2.0 5 votes vote down vote up
public CompletableFuture<Void> start(final EthScheduler ethScheduler) {
  final CompletableFuture<Void> fetchDataFuture = ethScheduler.startPipeline(fetchDataPipeline);
  final CompletableFuture<Void> completionFuture = ethScheduler.startPipeline(completionPipeline);

  fetchDataFuture.whenComplete(
      (result, error) -> {
        if (error != null) {
          if (!(ExceptionUtils.rootCause(error) instanceof CancellationException)) {
            LOG.error("Pipeline failed", error);
          }
          completionPipeline.abort();
        } else {
          // No more data to fetch, so propagate the pipe closure onto the completion pipe.
          requestsToComplete.close();
        }
      });

  completionFuture.exceptionally(
      error -> {
        if (!(ExceptionUtils.rootCause(error) instanceof CancellationException)) {
          LOG.error("Pipeline failed", error);
        }
        fetchDataPipeline.abort();
        return null;
      });
  return completionFuture;
}
 
Example 11
Source File: FastFuture.java    From cyclops with Apache License 2.0 5 votes vote down vote up
public FastFuture<T> populateFromCompletableFuture(final CompletableFuture<T> cf) {
    cf.thenAccept(i -> this.set(i));
    cf.exceptionally(t -> {
        completedExceptionally(t);
        return join();
    });
    return this;
}
 
Example 12
Source File: EndorserClient.java    From fabric-sdk-java with Apache License 2.0 5 votes vote down vote up
public CompletableFuture<Protocol.Response> sendDiscoveryRequestAsync(Protocol.SignedRequest signedRequest) {
    if (shutdown) {
        CompletableFuture<Protocol.Response> ret = new CompletableFuture<>();
        ret.completeExceptionally(new PeerException("Shutdown " + toString()));
        return ret;
    }

    CompletableFuture<Protocol.Response> future = CompletableFuturesExtra.toCompletableFuture(discoveryFutureStub.discover(signedRequest));
    return future.exceptionally(throwable -> {
        throw new CompletionException(format("%s %s", toString, throwable.getMessage()), throwable);
    });

}
 
Example 13
Source File: GuildImpl.java    From JDA with Apache License 2.0 5 votes vote down vote up
@Nonnull
@Override
public Task<List<Member>> retrieveMembersByIds(boolean includePresence, @Nonnull long... ids)
{
    Checks.notNull(ids, "ID Array");
    Checks.check(!includePresence || api.isIntent(GatewayIntent.GUILD_PRESENCES),
            "Cannot retrieve presences of members without GUILD_PRESENCES intent!");

    if (ids.length == 0)
        return new GatewayTask<>(CompletableFuture.completedFuture(Collections.emptyList()), () -> {});
    Checks.check(ids.length <= 100, "You can only request 100 members at once");
    MemberChunkManager chunkManager = api.getClient().getChunkManager();
    List<Member> collect = new ArrayList<>(ids.length);
    CompletableFuture<List<Member>> result = new CompletableFuture<>();
    CompletableFuture<Void> handle = chunkManager.chunkGuild(this, includePresence, ids, (last, list) -> {
        collect.addAll(list);
        if (last)
            result.complete(collect);
    });

    result.exceptionally(ex -> {
        WebSocketClient.LOG.error("Encountered exception trying to handle member chunk response", ex);
        return null;
    });

    return new GatewayTask<>(result, () -> handle.cancel(false));
}
 
Example 14
Source File: JDBCPublishedVersionStore.java    From enode with MIT License 5 votes vote down vote up
@Override
public CompletableFuture<Integer> getPublishedVersionAsync(String processorName, String aggregateRootTypeName, String aggregateRootId) {
    CompletableFuture<Integer> future = new CompletableFuture<>();
    String sql = String.format(SELECT_SQL, tableName);
    JsonArray array = new JsonArray();
    array.add(processorName);
    array.add(aggregateRootId);
    sqlClient.querySingleWithParams(sql, array, x -> {
        if (x.succeeded()) {
            int result = 0;
            if (x.result() != null && x.result().size() > 0) {
                result = x.result().getInteger(0);
            }
            future.complete(result);
            return;
        }
        future.completeExceptionally(x.cause());
    });
    return future.exceptionally(throwable -> {
        if (throwable instanceof SQLException) {
            SQLException ex = (SQLException) throwable;
            logger.error("Get aggregate published version has sql exception.", ex);
            throw new IORuntimeException(throwable);
        }
        logger.error("Get aggregate published version has unknown exception.", throwable);
        throw new EnodeRuntimeException(throwable);
    });
}
 
Example 15
Source File: FutureUtils.java    From besu with Apache License 2.0 5 votes vote down vote up
/**
 * Propagates cancellation, and only cancellation, from one future to another.
 *
 * <p>When <code>from</code> is completed with a {@link
 * java.util.concurrent.CancellationException} {@link java.util.concurrent.Future#cancel(boolean)}
 * will be called on <code>to</code>, allowing interruption if the future is currently running.
 *
 * @param from the CompletableFuture to take cancellation from
 * @param to the CompletableFuture to propagate cancellation to
 */
public static void propagateCancellation(
    final CompletableFuture<?> from, final CompletableFuture<?> to) {
  from.exceptionally(
      error -> {
        if (error instanceof CancellationException) {
          to.cancel(true);
        }
        return null;
      });
}
 
Example 16
Source File: FastSyncDownloaderTest.java    From besu with Apache License 2.0 5 votes vote down vote up
private <T> void assertCompletedExceptionally(
    final CompletableFuture<T> future, final FastSyncError expectedError) {
  assertThat(future).isCompletedExceptionally();
  future.exceptionally(
      actualError -> {
        assertThat(actualError)
            .isInstanceOf(FastSyncException.class)
            .extracting(ex -> ((FastSyncException) ex).getError())
            .isEqualTo(expectedError);
        return null;
      });
}
 
Example 17
Source File: FastSyncDownloader.java    From besu with Apache License 2.0 5 votes vote down vote up
private CompletableFuture<FastSyncState> downloadChainAndWorldState(
    final FastSyncState currentState) {
  // Synchronized ensures that stop isn't called while we're in the process of starting a
  // world state and chain download. If it did we might wind up starting a new download
  // after the stop method had called cancel.
  synchronized (this) {
    if (!running.get()) {
      return CompletableFuture.failedFuture(
          new CancellationException("FastSyncDownloader stopped"));
    }
    final CompletableFuture<Void> worldStateFuture =
        worldStateDownloader.run(currentState.getPivotBlockHeader().get());
    final ChainDownloader chainDownloader = fastSyncActions.createChainDownloader(currentState);
    final CompletableFuture<Void> chainFuture = chainDownloader.start();

    // If either download fails, cancel the other one.
    chainFuture.exceptionally(
        error -> {
          worldStateFuture.cancel(true);
          return null;
        });
    worldStateFuture.exceptionally(
        error -> {
          chainDownloader.cancel();
          return null;
        });

    return CompletableFuture.allOf(worldStateFuture, chainFuture)
        .thenApply(
            complete -> {
              trailingPeerRequirements = Optional.empty();
              return currentState;
            });
  }
}
 
Example 18
Source File: JDBCPublishedVersionStore.java    From enode with MIT License 4 votes vote down vote up
@Override
public CompletableFuture<Integer> updatePublishedVersionAsync(String processorName, String aggregateRootTypeName, String aggregateRootId, int publishedVersion) {
    CompletableFuture<Integer> future = new CompletableFuture<>();
    String sql = "";
    boolean isInsert = publishedVersion == 1;
    JsonArray array = new JsonArray();
    if (isInsert) {
        sql = String.format(INSERT_SQL, tableName);
        array.add(processorName);
        array.add(aggregateRootTypeName);
        array.add(aggregateRootId);
        array.add(1);
        array.add(new Date().toInstant());
    } else {
        sql = String.format(UPDATE_SQL, tableName);
        array.add(publishedVersion);
        array.add(new Date().toInstant());
        array.add(processorName);
        array.add(aggregateRootId);
        array.add(publishedVersion - 1);
    }
    sqlClient.updateWithParams(sql, array, x -> {
        if (x.succeeded()) {
            future.complete(x.result().getUpdated());
            return;
        }
        future.completeExceptionally(x.cause());
    });
    return future.exceptionally(throwable -> {
        if (throwable instanceof SQLException) {
            SQLException ex = (SQLException) throwable;
            // insert duplicate return
            if (isInsert && ex.getSQLState().equals(sqlState) && ex.getMessage().contains(uniqueIndexName)) {
                return 0;
            }
            logger.error("Insert or update aggregate published version has sql exception.", ex);
            throw new IORuntimeException(throwable);
        }
        logger.error("Insert or update aggregate published version has unknown exception.", throwable);
        throw new EnodeRuntimeException(throwable);

    });
}
 
Example 19
Source File: MongoPublishedVersionStore.java    From enode with MIT License 4 votes vote down vote up
@Override
public CompletableFuture<Integer> getPublishedVersionAsync(String processorName, String aggregateRootTypeName, String aggregateRootId) {
    CompletableFuture<Integer> future = new CompletableFuture<>();
    Bson updateFilter = Filters.and(
            Filters.eq("processorName", processorName),
            Filters.eq("aggregateRootId", aggregateRootId)
    );
    mongoClient.getDatabase(configuration.getDatabaseName()).getCollection(configuration.getPublishedVersionCollectionName()).find(updateFilter).subscribe(new Subscriber<Document>() {
        private Integer version = 0;

        @Override
        public void onSubscribe(Subscription s) {
            s.request(1);
        }

        @Override
        public void onNext(Document document) {
            version = document.getInteger("version");
            future.complete(version);
        }

        @Override
        public void onError(Throwable t) {
            future.completeExceptionally(t);
        }

        @Override
        public void onComplete() {
            future.complete(version);
        }
    });
    return future.exceptionally(throwable -> {
        if (throwable instanceof SQLException) {
            SQLException ex = (SQLException) throwable;
            logger.error("Get aggregate published version has sql exception.", ex);
            throw new IORuntimeException(throwable);
        }
        logger.error("Get aggregate published version has unknown exception.", throwable);
        throw new EnodeRuntimeException(throwable);
    });
}
 
Example 20
Source File: OwnedBundle.java    From pulsar with Apache License 2.0 4 votes vote down vote up
/**
 * It unloads the bundle by closing all topics concurrently under this bundle.
 *
 * <pre>
 * a. disable bundle ownership in memory and not in zk
 * b. close all the topics concurrently
 * c. delete ownership znode from zookeeper.
 * </pre>
 *
 * @param pulsar
 * @param timeout
 *            timeout for unloading bundle. It doesn't throw exception if it times out while waiting on closing all
 *            topics
 * @param timeoutUnit
 * @throws Exception
 */
public CompletableFuture<Void> handleUnloadRequest(PulsarService pulsar, long timeout, TimeUnit timeoutUnit) {
    long unloadBundleStartTime = System.nanoTime();
    // Need a per namespace RenetrantReadWriteLock
    // Here to do a writeLock to set the flag and proceed to check and close connections
    try {
        while (!this.nsLock.writeLock().tryLock(1, TimeUnit.SECONDS)) {
            // Using tryLock to avoid deadlocks caused by 2 threads trying to acquire 2 readlocks (eg: replicators)
            // while a handleUnloadRequest happens in the middle
            LOG.warn("Contention on OwnedBundle rw lock. Retrying to acquire lock write lock");
        }

        try {
            // set the flag locally s.t. no more producer/consumer to this namespace is allowed
            if (!IS_ACTIVE_UPDATER.compareAndSet(this, TRUE, FALSE)) {
                // An exception is thrown when the namespace is not in active state (i.e. another thread is
                // removing/have removed it)
                return FutureUtil.failedFuture(new IllegalStateException(
                        "Namespace is not active. ns:" + this.bundle + "; state:" + IS_ACTIVE_UPDATER.get(this)));
            }
        } finally {
            // no matter success or not, unlock
            this.nsLock.writeLock().unlock();
        }
    } catch (InterruptedException e) {
        return FutureUtil.failedFuture(e);
    }

    AtomicInteger unloadedTopics = new AtomicInteger();
    LOG.info("Disabling ownership: {}", this.bundle);

    // close topics forcefully
    CompletableFuture<Void> future = pulsar.getNamespaceService().getOwnershipCache()
            .updateBundleState(this.bundle, false)
            .thenCompose(v -> pulsar.getBrokerService().unloadServiceUnit(bundle, true, timeout, timeoutUnit))
            .handle((numUnloadedTopics, ex) -> {
                if (ex != null) {
                    // ignore topic-close failure to unload bundle
                    LOG.error("Failed to close topics under namespace {}", bundle.toString(), ex);
                } else {
                    unloadedTopics.set(numUnloadedTopics);
                }
                return null;
            })
            .thenCompose(v -> {
                // delete ownership node on zk
                return pulsar.getNamespaceService().getOwnershipCache().removeOwnership(bundle);
            }).thenAccept(v -> {
                double unloadBundleTime = TimeUnit.NANOSECONDS
                        .toMillis((System.nanoTime() - unloadBundleStartTime));
                LOG.info("Unloading {} namespace-bundle with {} topics completed in {} ms", this.bundle,
                        unloadedTopics, unloadBundleTime);
            });

    future.exceptionally(ex -> {
        // Failed to remove ownership node: enable namespace-bundle again so, it can serve new topics
        pulsar.getNamespaceService().getOwnershipCache().updateBundleState(this.bundle, true);
        return null;
    });
    return future;
}