@Test(expected = Exception.class) public void testConsumeInternalsFailure() { urlSetup("testQueue", "testUrl"); receiveSetup(); ChangeMessageVisibilityRequest changeVisibilityReq = ChangeMessageVisibilityRequest.builder() .queueUrl("testUrl") .receiptHandle("testHandle") .visibilityTimeout(0) .build(); CompletableFuture<ChangeMessageVisibilityResponse> visibilityResponse = CompletableFuture.completedFuture(ChangeMessageVisibilityResponse.builder().build()); when(awsAsyncSqsClient.changeMessageVisibility(changeVisibilityReq)) .thenReturn(visibilityResponse); ArgumentCaptor<ChangeMessageVisibilityRequest> visibilityReq = ArgumentCaptor.forClass(ChangeMessageVisibilityRequest.class); CompletableFuture<Void> future = new CompletableFuture<>(); future.completeExceptionally(new Exception("async consumer completing exceptionally")); AsyncConsumer<String> function = (str, threadpool) -> future; CompletableFuture<Boolean> result = asyncClient.consume(function, "testQueue"); verify(awsAsyncSqsClient).changeMessageVisibility(visibilityReq.capture()); assertEquals(visibilityReq.getValue().queueUrl(), "testUrl"); assertEquals(visibilityReq.getValue().receiptHandle(), "testHandle"); assertEquals(visibilityReq.getValue().visibilityTimeout(), new Integer(0)); verify(awsAsyncSqsClient, times(1)) .changeMessageVisibility(any(ChangeMessageVisibilityRequest.class)); result.join(); }
@Override public CompletableFuture<Boolean> consume( @NonNull final Consumer<String> consumer, @NonNull final String queueName) { return consumeInternal( (body, executor) -> CompletableFuture.runAsync(() -> consumer.accept(body), executor), queueName); }
AsyncSqsClientImpl implements AsyncSqsClient { @Override public CompletableFuture<Boolean> consume( @NonNull final Consumer<String> consumer, @NonNull final String queueName) { return consumeInternal( (body, executor) -> CompletableFuture.runAsync(() -> consumer.accept(body), executor), queueName); } }
AsyncSqsClientImpl implements AsyncSqsClient { @Override public CompletableFuture<Boolean> consume( @NonNull final Consumer<String> consumer, @NonNull final String queueName) { return consumeInternal( (body, executor) -> CompletableFuture.runAsync(() -> consumer.accept(body), executor), queueName); } @Inject  AsyncSqsClientImpl(
      @NonNull final SqsAsyncClient client,
      @NonNull final AsyncConveyorMetrics metrics,
      @NonNull final ExecutorService executor);   AsyncSqsClientImpl(
      @NonNull final SqsAsyncClient client,
      @NonNull final AsyncConveyorMetrics metrics,
      @NonNull final ExecutorService executor,
      long maxCacheSize,
      int receiveWaitTimeoutSeconds,
      int bulkheadMaxWaitMillis,
      int consumerConcurrency); }
AsyncSqsClientImpl implements AsyncSqsClient { @Override public CompletableFuture<Boolean> consume( @NonNull final Consumer<String> consumer, @NonNull final String queueName) { return consumeInternal( (body, executor) -> CompletableFuture.runAsync(() -> consumer.accept(body), executor), queueName); } @Inject  AsyncSqsClientImpl(
      @NonNull final SqsAsyncClient client,
      @NonNull final AsyncConveyorMetrics metrics,
      @NonNull final ExecutorService executor);   AsyncSqsClientImpl(
      @NonNull final SqsAsyncClient client,
      @NonNull final AsyncConveyorMetrics metrics,
      @NonNull final ExecutorService executor,
      long maxCacheSize,
      int receiveWaitTimeoutSeconds,
      int bulkheadMaxWaitMillis,
      int consumerConcurrency); @Override CompletableFuture<Void> add(
      @NonNull final String message, @NonNull final String queueName); @Override CompletableFuture<Void> add(
      @NonNull final String message, @NonNull final String queueName, int delaySeconds); @Override CompletableFuture<Boolean> consume(
      @NonNull final Consumer<String> consumer, @NonNull final String queueName); @Override CompletableFuture<Boolean> consume(AsyncConsumer<String> consumer, String queueName); @Override void close(); }
AsyncSqsClientImpl implements AsyncSqsClient { @Override public CompletableFuture<Boolean> consume( @NonNull final Consumer<String> consumer, @NonNull final String queueName) { return consumeInternal( (body, executor) -> CompletableFuture.runAsync(() -> consumer.accept(body), executor), queueName); } @Inject  AsyncSqsClientImpl(
      @NonNull final SqsAsyncClient client,
      @NonNull final AsyncConveyorMetrics metrics,
      @NonNull final ExecutorService executor);   AsyncSqsClientImpl(
      @NonNull final SqsAsyncClient client,
      @NonNull final AsyncConveyorMetrics metrics,
      @NonNull final ExecutorService executor,
      long maxCacheSize,
      int receiveWaitTimeoutSeconds,
      int bulkheadMaxWaitMillis,
      int consumerConcurrency); @Override CompletableFuture<Void> add(
      @NonNull final String message, @NonNull final String queueName); @Override CompletableFuture<Void> add(
      @NonNull final String message, @NonNull final String queueName, int delaySeconds); @Override CompletableFuture<Boolean> consume(
      @NonNull final Consumer<String> consumer, @NonNull final String queueName); @Override CompletableFuture<Boolean> consume(AsyncConsumer<String> consumer, String queueName); @Override void close();  }