/** * Create a new async result which exposes the given exception as an * {@link ExecutionException} from {@link Future#get()}. * @param ex the exception to expose (either an pre-built {@link ExecutionException} * or a cause to be wrapped in an {@link ExecutionException}) * @since 4.2 * @see ExecutionException */ public static <V> ListenableFuture<V> forExecutionException(Throwable ex) { return new AsyncResult<>(null, ex); }
@Override public void addCallback(ListenableFutureCallback<? super V> callback) { addCallback(callback, callback); }
@Override public CompletableFuture<V> completable() { if (this.executionException != null) { CompletableFuture<V> completable = new CompletableFuture<>(); completable.completeExceptionally(exposedException(this.executionException)); return completable; } else { return CompletableFuture.completedFuture(this.value); } }
@Async public Future<String> returnSomething(int i) { assertTrue(!Thread.currentThread().getName().equals(originalThreadName)); if (i == 0) { throw new IllegalArgumentException(); } else if (i < 0) { return AsyncResult.forExecutionException(new IOException()); } return AsyncResult.forValue(Integer.toString(i)); }
@Async public ListenableFuture<String> returnSomethingListenable(int i) { assertTrue(!Thread.currentThread().getName().equals(originalThreadName)); if (i == 0) { throw new IllegalArgumentException(); } else if (i < 0) { return AsyncResult.forExecutionException(new IOException()); } return new AsyncResult<>(Integer.toString(i)); }
@Test public void asyncResultWithSeparateCallbacksAndValue() throws Exception { String value = "val"; final Set<String> values = new HashSet<>(1); ListenableFuture<String> future = AsyncResult.forValue(value); future.addCallback(values::add, (ex) -> fail("Failure callback not expected: " + ex)); assertSame(value, values.iterator().next()); assertSame(value, future.get()); assertSame(value, future.completable().get()); future.completable().thenAccept(v -> assertSame(value, v)); }
@Test public void asyncResultWithCallbackAndValue() throws Exception { String value = "val"; final Set<String> values = new HashSet<>(1); ListenableFuture<String> future = AsyncResult.forValue(value); future.addCallback(new ListenableFutureCallback<String>() { @Override public void onSuccess(String result) { values.add(result); } @Override public void onFailure(Throwable ex) { fail("Failure callback not expected: " + ex); } }); assertSame(value, values.iterator().next()); assertSame(value, future.get()); assertSame(value, future.completable().get()); future.completable().thenAccept(v -> assertSame(value, v)); }
/** * Create a new async result which exposes the given value from {@link Future#get()}. * @param value the value to expose * @since 4.2 * @see Future#get() */ public static <V> ListenableFuture<V> forValue(V value) { return new AsyncResult<>(value, null); }
@Override public CompletableFuture<V> completable() { if (this.executionException != null) { CompletableFuture<V> completable = new CompletableFuture<>(); completable.completeExceptionally(exposedException(this.executionException)); return completable; } else { return CompletableFuture.completedFuture(this.value); } }
@Async public Future<String> testFuture(int index) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return AsyncResult.forValue("FutureTask:" + index); }
@Override public void addCallback(ListenableFutureCallback<? super V> callback) { addCallback(callback, callback); }
/** * Create a new async result which exposes the given exception as an * {@link ExecutionException} from {@link Future#get()}. * @param ex the exception to expose (either an pre-built {@link ExecutionException} * or a cause to be wrapped in an {@link ExecutionException}) * @since 4.2 * @see ExecutionException */ public static <V> ListenableFuture<V> forExecutionException(Throwable ex) { return new AsyncResult<>(null, ex); }
@Override public void addCallback(SuccessCallback<? super V> successCallback, FailureCallback failureCallback) { try { if (this.executionException != null) { failureCallback.onFailure(exposedException(this.executionException)); } else { successCallback.onSuccess(this.value); } } catch (Throwable ex) { // Ignore } }
@Async public ListenableFuture<String> testLisenableAsync(int index) { if (index == 10) throw new RuntimeException("testLisenableAsync:" + index); return AsyncResult.forValue("testValue:" + index + ",threadId:" + Thread.currentThread().getId()); }
@Override public void addCallback(ListenableFutureCallback<? super V> callback) { addCallback(callback, callback); }
/** * Create a new async result which exposes the given value from {@link Future#get()}. * @param value the value to expose * @since 4.2 * @see Future#get() */ public static <V> ListenableFuture<V> forValue(V value) { return new AsyncResult<>(value, null); }
@Override public void addCallback(SuccessCallback<? super V> successCallback, FailureCallback failureCallback) { try { if (this.executionException != null) { failureCallback.onFailure(exposedException(this.executionException)); } else { successCallback.onSuccess(this.value); } } catch (Throwable ex) { // Ignore } }
@SuppressWarnings("ConstantConditions") private int getEffectiveFetchSize(Statement statement) { if (statement.getFetchSize() > 0) { return statement.getFetchSize(); } if (getAsyncCqlOperations() instanceof CassandraAccessor) { CassandraAccessor accessor = (CassandraAccessor) getAsyncCqlOperations(); if (accessor.getFetchSize() != -1) { return accessor.getFetchSize(); } } return getAsyncCqlOperations() .execute((AsyncSessionCallback<Integer>) session -> AsyncResult.forValue(getConfiguredFetchSize(session))) .completable().join(); }
public Future<Integer> incrementReturningAFuture() { counter++; return new AsyncResult<Integer>(5); } }
@Override public CompletableFuture<V> completable() { if (this.executionException != null) { CompletableFuture<V> completable = new CompletableFuture<>(); completable.completeExceptionally(exposedException(this.executionException)); return completable; } else { return CompletableFuture.completedFuture(this.value); } }