diff --git a/CHANGELOG.md b/CHANGELOG.md index 70bc7998..07bcb5ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +### Release 2.2.6 (November 7, 2019) +[Milestone#43](https://github.com/awslabs/amazon-kinesis-client/milestone/43) +* Updating the SDK version to 2.9.25. + * [PR#638](https://github.com/awslabs/amazon-kinesis-client/pull/638) +* Clearing the local cache on a subscription termination, to avoid noisy logs on new subscriptions. + * [PR#642](https://github.com/awslabs/amazon-kinesis-client/pull/642) +* Updating the SDK version to 2.10.0 in order to fix the premature H2 stream close issue. + * [PR#649](https://github.com/awslabs/amazon-kinesis-client/pull/649) + * NOTE: SDK has a known connection teardown issue when multiple H2 streams are used within a connection. This might result in shard consumers sticking to a stale service host and not progressing. If your shard consumer gets stuck, use the following configuration as a workaround. This configuration might result in up to 5X increase in total connections. + ``` + KinesisAsyncClient kinesisClient = KinesisAsyncClient.builder() + .region(region) + .httpClientBuilder(NettyNioAsyncHttpClient.builder().maxConcurrency(Integer.MAX_VALUE).maxHttp2Streams(1)) + .build() + ``` ### Release 2.2.5 (October 23, 2019) diff --git a/README.md b/README.md index a1ac9f19..3a9dd9e6 100644 --- a/README.md +++ b/README.md @@ -60,14 +60,30 @@ The recommended way to use the KCL for Java is to consume it from Maven. ## Release Notes -### Latest Release (2.2.5 - October 23, 2019) +### Latest Release (2.2.6 - November 7, 2019) +[Milestone#43](https://github.com/awslabs/amazon-kinesis-client/milestone/43) +* Updating the SDK version to 2.9.25. + * [PR#638](https://github.com/awslabs/amazon-kinesis-client/pull/638) +* Clearing the local cache on a subscription termination, to avoid noisy logs on new subscriptions. + * [PR#642](https://github.com/awslabs/amazon-kinesis-client/pull/642) +* Updating the SDK version to 2.10.0 in order to fix the premature H2 stream close issue. + * [PR#649](https://github.com/awslabs/amazon-kinesis-client/pull/649) + * NOTE: SDK has a known connection teardown issue when multiple H2 streams are used within a connection. This might result in shard consumers sticking to a stale service host and not progressing. If your shard consumer gets stuck, use the following configuration as a workaround. This configuration might result in up to 5X increase in total connections. + ``` + KinesisAsyncClient kinesisClient = KinesisAsyncClient.builder() + .region(region) + .httpClientBuilder(NettyNioAsyncHttpClient.builder().maxConcurrency(Integer.MAX_VALUE).maxHttp2Streams(1)) + .build() + ``` + +### Related Prior Release (2.2.5 - October 23, 2019) [Milestone#40](https://github.com/awslabs/amazon-kinesis-client/milestone/40) * Updating Sonatype to dedicated AWS endpoint. * [PR#619](https://github.com/awslabs/amazon-kinesis-client/pull/619) * Introducing a validation step to verify if ShardEnd is reached, to prevent shard consumer stuck scenarios in the event of malformed response from service. * [PR#624](https://github.com/awslabs/amazon-kinesis-client/pull/624) -### Latest Release (2.2.4 - September 23, 2019) +### Related Prior Release (2.2.4 - September 23, 2019) [Milestone#39](https://github.com/awslabs/amazon-kinesis-client/milestone/39) * Making FanoutRecordsPublisher test cases resilient to delayed thread operations * [PR#612](https://github.com/awslabs/amazon-kinesis-client/pull/612) diff --git a/amazon-kinesis-client-multilang/pom.xml b/amazon-kinesis-client-multilang/pom.xml index 11a18c36..fb0e2780 100644 --- a/amazon-kinesis-client-multilang/pom.xml +++ b/amazon-kinesis-client-multilang/pom.xml @@ -21,7 +21,7 @@ amazon-kinesis-client-pom software.amazon.kinesis - 2.2.6-SNAPSHOT + 2.2.6 4.0.0 diff --git a/amazon-kinesis-client/pom.xml b/amazon-kinesis-client/pom.xml index 9f6f377f..b6fd20da 100644 --- a/amazon-kinesis-client/pom.xml +++ b/amazon-kinesis-client/pom.xml @@ -22,7 +22,7 @@ software.amazon.kinesis amazon-kinesis-client-pom - 2.2.6-SNAPSHOT + 2.2.6 amazon-kinesis-client diff --git a/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java index c112804b..0090d69d 100644 --- a/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java +++ b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java @@ -34,7 +34,7 @@ public class RetrievalConfig { */ public static final String KINESIS_CLIENT_LIB_USER_AGENT = "amazon-kinesis-client-library-java"; - public static final String KINESIS_CLIENT_LIB_USER_AGENT_VERSION = "2.2.6-SNAPSHOT"; + public static final String KINESIS_CLIENT_LIB_USER_AGENT_VERSION = "2.2.6"; /** * Client used to make calls to Kinesis for records retrieval diff --git a/amazon-kinesis-client/src/test/java/software/amazon/kinesis/lifecycle/ShardConsumerSubscriberTest.java b/amazon-kinesis-client/src/test/java/software/amazon/kinesis/lifecycle/ShardConsumerSubscriberTest.java index a4002ab9..4d0f01ee 100644 --- a/amazon-kinesis-client/src/test/java/software/amazon/kinesis/lifecycle/ShardConsumerSubscriberTest.java +++ b/amazon-kinesis-client/src/test/java/software/amazon/kinesis/lifecycle/ShardConsumerSubscriberTest.java @@ -140,8 +140,7 @@ public class ShardConsumerSubscriberTest { processedNotifier.wait(5000); } - verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); } @Test @@ -176,8 +175,7 @@ public class ShardConsumerSubscriberTest { assertThat(subscriber.getAndResetDispatchFailure(), equalTo(testException)); assertThat(subscriber.getAndResetDispatchFailure(), nullValue()); - verify(shardConsumer, times(20)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(20)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); } @@ -202,8 +200,7 @@ public class ShardConsumerSubscriberTest { Thread.sleep(10); } - verify(shardConsumer, times(10)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(10)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); assertThat(subscriber.retrievalFailure(), equalTo(expected)); } @@ -239,8 +236,7 @@ public class ShardConsumerSubscriberTest { } assertThat(recordsPublisher.restartedFrom, equalTo(edgeRecord)); - verify(shardConsumer, times(20)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(20)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); } @Test @@ -304,8 +300,7 @@ public class ShardConsumerSubscriberTest { processedNotifier.wait(5000); } - verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); assertThat(received.size(), equalTo(recordsPublisher.responses.size())); Stream.iterate(0, i -> i + 1).limit(received.size()).forEach(i -> assertThat(received.get(i), @@ -344,8 +339,7 @@ public class ShardConsumerSubscriberTest { // Verifying that there are no interactions with shardConsumer mock indicating no records were sent back and // subscription has not started correctly. - verify(shardConsumer, never()).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, never()).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); Stream.iterate(2, i -> i + 1).limit(98).forEach(this::addUniqueItem); @@ -361,8 +355,7 @@ public class ShardConsumerSubscriberTest { } // Verify that shardConsumer mock was called 100 times and all 100 input records are processed. - verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(100)).handleInput(any(ProcessRecordsInput.class), any(Subscription.class)); // Verify that received records in the subscriber are equal to the ones sent by the record publisher. assertThat(received.size(), equalTo(recordsPublisher.responses.size())); @@ -406,8 +399,7 @@ public class ShardConsumerSubscriberTest { // Verifying that there are no interactions with shardConsumer mock indicating no records were sent back and // subscription has not started correctly. - verify(shardConsumer, never()).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, never()).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); Stream.iterate(2, i -> i + 1).limit(98).forEach(this::addUniqueItem); @@ -423,8 +415,7 @@ public class ShardConsumerSubscriberTest { } // Verify that shardConsumer mock was called 100 times and all 100 input records are processed. - verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), - any(Subscription.class)); + verify(shardConsumer, times(100)).handleInput(argThat(eqProcessRecordsInput(processRecordsInput)), any(Subscription.class)); // Verify that received records in the subscriber are equal to the ones sent by the record publisher. assertThat(received.size(), equalTo(recordsPublisher.responses.size())); diff --git a/pom.xml b/pom.xml index 099d1493..54962049 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ amazon-kinesis-client-pom pom Amazon Kinesis Client Library - 2.2.6-SNAPSHOT + 2.2.6 The Amazon Kinesis Client Library for Java enables Java developers to easily consume and process data from Amazon Kinesis.