Commit Graph

87 Commits

Author SHA1 Message Date
Artem Bilan
a8d370ff4c GH-70: KinesisMDCA: Get rid of busy-spin CPU
Fixes spring-projects/spring-integration-aws#70

* The `ConsumerDispatcher` is infinite, non-blocking loop:
add short `Thread.sleep(1)` to the loop to yield the CPU
* The `ConsumerInvoker` is infinite loop, too, but can be blocked:
add `Condition` to wait to the particular notification from the
`ShardConsumer` when it changes its state
2017-05-31 17:45:32 -04:00
Artem Bilan
4a0201f29d GH-71: Kinesis Adapters: Handle byte[] directly
Fixes spring-projects/spring-integration-aws#71

It isn't correct to call `converter.convert()` in the
`KinesisMessageHandler` if `payload` is already `ByteBuffer` or `byte[]`
On the other hand an application might be interested in the `byte[]`
payload on the consumer side.
The `KinesisMessageDrivenChannelAdapter` must be able to produce
`byte[]` `payload` without any conversion.

* Add logic into `KinesisMessageHandler` to check the `payload` type
before calling `converter.convert()`
* Allow to configure `converter` to `null` for the
`KinesisMessageDrivenChannelAdapter`.
 The body of the consumed record is presented in the `payload` as is -
 `byte[]`
* Add JavaDoc to the `KinesisMessageHandler.setConverter()`
2017-05-31 13:19:33 -04:00
Anwar Chirakkattil
1e016972ce GH-67: Ignore starting slashes in S3 bucket name
Fixes: spring-projects/spring-integration-aws#67

* Use `org.springframework.util.StringUtils#trimLeadingCharacter()`
to remove any useless leading `/` in the bucket name
2017-05-30 11:29:51 -04:00
Artem Bilan
9b5a5e38bc Fix KinesisMessageDrivenChannelAdapterTests
* Upgrade to Gradle 3.5
* Make S3 test Java 8 based
2017-05-30 11:08:28 -04:00
Artem Bilan
d65fbebc31 GH-63: Kinesis: Add diagnostics for closed shards
Fixes spring-projects/spring-integration-aws#63
2017-04-06 13:37:35 -04:00
Artem Bilan
8e7e1a02b6 GH-63: Kinesis: fix logic to skip closed shards
Fixes spring-projects/spring-integration-aws#63

The `CLOSED` shards have `endingSequenceNumber` value and they can't be
considered for consuming independently of the value in the `checkpoint`

* Introduce local `shardsToConsume` variable in the
`KinesisMessageDrivenChannelAdapter#populateShardsForStream()` to
store only `OPEN` shards for future consumption
* Fix the logic to determine the last `shardId` for a subsequent
`describeStream()` request based on the shards result exactly from
the `describeStreamResult.getStreamDescription().getShards()`, not
already filtered `shardsToConsume`
2017-04-04 19:54:57 -04:00
Artem Bilan
c8195fb9b5 GH-56: Upgrade to SC-AWS-1.2 RC1
Fixes: spring-projects/spring-integration-aws#56

The upgrade to SC-AWS-1.2 RC1 resolves US_East_2 Region concern
since AWS SDK is polled in version `1.1.98`

Also fix deprecation warnings in S3 support components
2017-03-30 14:42:07 -04:00
Krzysztof Witkowski
b552a0892c Handle expired and throttling in ShardConsumer
When shard iterator is expired (`ExpiredIteratorException`),
we have to restart from the stored sequence number

When shard iterator is throttled (`ProvisionedThroughputExceededException`),
 we have to "sleep" for backoff period

* Catch `ExpiredIteratorException` on the `.amazonKinesis.getRecords()` request
and move `ShardConsumer` to the `ConsumerState.EXPIRED`.
This state is treated as `NEW`, therefore a fresh `amazonKinesis.getShardIterator()`
is performed

* Catch `ProvisionedThroughputExceededException` on the `.amazonKinesis.getRecords()`
request and move `ShardConsumer` to the `ConsumerState.SLEEP`
for the `KinesisMessageDrivenChannelAdapter.this.consumerBackoff` period
2017-03-30 14:20:26 -04:00
Artem Bilan
8d120e020c GH-61: Use shutdown for executors in KinesisMDCA
Fixes: spring-projects/spring-integration-aws#61

With the `shutdownNow()` the currently ran task are marked with the
`Thread.interrupt()`.
The AWS SDK catch this situation and throws `AbortedException`

* To let currently ran task finish properly switch from the
`shutdownNow()` to the `shutdown()` for internal executors

The external Spring-based executors (`ExecutorConfigurationSupport`)
must be supplied with the `waitForTasksToCompleteOnShutdown` option
2017-03-28 20:12:24 -04:00
Artem Bilan
041290dbb8 GH-60: Fix NPE in KinesisMessageDrivenChAdapter
Fixes: spring-projects/spring-integration-aws#60

The attempts to extract `this.consumerInvokers.get(0)` when the `concurrency == 0` lead to the NPE

* Wrap `this.consumerInvokers.get(0)` block to the `if(concurrency != 0)`
2017-03-28 14:51:42 -04:00
Krzysztof Witkowski
8d1839980b Fix concurrent modification in ConsumerInvoker
`ConsumerInvoker` uses iterator over `consumers` property, which can be
concurrently modified in the `populateConsumer()`` method, thus triggering
`ConcurrentModificationException`:

```
Exception in thread "kinesisChannel-kinesis-consumer-1" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at org.springframework.integration.aws.inbound.kinesis.KinesisMessageDrivenChannelAdapter$ConsumerInvoker.run(KinesisMessageDrivenChannelAdapter.java:866)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
```

* Use a `ConcurrentLinkedQueue` instead of `ArrayList`  to fix a concurrent Modification problem.
2017-03-25 18:14:50 -04:00
Spring Buildmaster
e607ab2383 [artifactory-release] Next development version 2017-03-09 22:40:29 +00:00
Spring Buildmaster
96c8d2360d [artifactory-release] Release version 1.1.0.M1 2017-03-09 22:40:26 +00:00
Artem Bilan
0c81e4d791 Add @DirtiesContext to test classes 2017-03-09 17:37:20 -05:00
Artem Bilan
085548b71d UnIgnore KinesisMessageDrivenChannelAdapterTests 2017-03-09 15:47:03 -05:00
Artem Bilan
bd23958330 Ignore KinesisMessageDrivenChannelAdapterTests 2017-03-09 15:27:37 -05:00
Artem Bilan
cdb68123db Upgrade to Gradle 3.4.1 and fix typo 2017-03-09 15:02:25 -05:00
Artem Bilan
4c4c67d665 Revert to Gradle 3.3 2017-03-09 14:11:39 -05:00
Artem Bilan
416ac4305c Upgrade Gradle to 3.4.1 and others
Apply `io.spring.dependency-management` plugin to use boms for dependencies
2017-03-09 09:31:36 -05:00
Artem Bilan
f75c86aba7 Upgrade to Gradle 3.3 and other build adjustments 2017-02-07 15:26:26 -05:00
Mike Girard
3e692f529a Update to spring-cloud-aws-1.1.3
Fixes GH-49 (https://github.com/spring-projects/spring-integration-aws/issues/49)
2017-02-07 13:35:58 -05:00
Marius Bogoevici
ace4055ed9 Remove amazon-kinesis-client
* Remove the `amazon-kinesis-client` dependency
* Use `CustomizableThreadFactory` instead of `NamedThreadFactory`
2017-01-25 09:46:57 -05:00
Artem Bilan
ef2f5f7aef GH-22: Add KinesisMessageDrivenChannelAdapter
Fixes GH-22 (https://github.com/spring-projects/spring-integration-aws/issues/22)

Rework logic to the `dispatching` and tasks

* Add `LimitExceededException` and configurable retry logic for the `describeStream`
* Skip `CLOSED` shards which has been read before according stored `checkpoint`. Will be useful for `after resharding` algorithm
* Add `adapt to resharding` logic
* Add `KinesisMessageDrivenChannelAdapterTests` based on mocks
* Add Thread Affinity for `ShardConsumer`s via `concurrency` option
* Introduce `concurrency` option and `ConsumerInvoker`.
  `ShardConsumer`s are now distributed between `ConsumerInvoker`s if `concurrency > 0`
  `ConsumerInvoker`s are scheduled to the `ConsumerExecutor` as a `isLongLived` tasks
  The concurrency is adjusted if there are no more `ShardConsumer`s to process (`STOP` state because of closed shard).
  At the same time newly populated `ShardConsumer`s (e.g. after resharding) is distributed evenly between existing `ConsumerExecutor`s if `maxConcurrency` is exceeded.
Otherwise fresh `ConsumerExecutor` is started for new `ShardConsumer`
2017-01-25 09:21:07 -05:00
Artem Bilan
0e31261545 GH-54: Rename S3StreamingMessageSource
Fixes GH-54 (https://github.com/spring-projects/spring-integration-aws/issues/54)

For consistency with other `AbstractRemoteFileStreamingMessageSource` implementations (e.g. `FtpStreamingMessageSource`) rename `S3InboundStreamingMessageSource` to the `S3StreamingMessageSource`

Since there was no any Milestones for the `1.1` version yet, it is safe to do this renaming breaking change
2016-11-28 15:27:48 -05:00
Artem Bilan
1eab3c0d98 Get rid of KCL.
Rely only native AWS SDK API
2016-10-13 14:27:05 -04:00
Artem Bilan
fa416e40f7 Add support for PutRecordRequest and PutRecordsRequest as payload 2016-10-13 14:27:05 -04:00
Artem Bilan
dda290f271 GH-22: Add KinesisMessageHandler
Fixes GH-22 (https://github.com/spring-projects/spring-integration-aws/issues/22)

* Add `KinesisMessageHandler` based on the `AmazonKinesisAsync.putRecordAsync()` operation.
The logic is fully similar to the `KafkaProducerMessageHandler` since both protocols pursue the same behavior
* Add some Kinesis specific `AwsHeaders`
* Upgrade to Gradle 2.14.1
2016-10-13 14:27:05 -04:00
Artem Bilan
5b9c3c3120 Downgrade to Gradle-2.14 2016-09-20 11:44:14 -04:00
Artem Bilan
95875045d2 Downgrade to Gradle-3.0 2016-09-20 11:04:52 -04:00
Artem Bilan
b1a6b59dab Use S3PersistentAcceptOnceFLFilter by default
To avoid some local work with files, add `S3PersistentAcceptOnceFileListFilter` to the `S3InboundFileSynchronizer` as a default one

* Upgrade to Gradle 3.1
* Upgrade to SI-4.3.2
* Some `build.gradle` polishing
* Downgrade to Checkstyle-6.16.1 because of `RequireThis` bug
2016-09-19 17:22:42 -04:00
Artem Bilan
f5a6b1c44c Upgrade to AssertJ-2.5.2 and Checkstyle-7.1
According changes in the `RequireThis`, the `this.` modifier is required now only in case of overlapping:
https://github.com/checkstyle/checkstyle/issues/3418

* Add `validateOnlyOverlapping = false` to reinstate the previous behavior, but we should think one more time if we really should be so strict with this rule
2016-09-01 10:25:34 -04:00
Artem Bilan
985f888281 Fix S3InboundStreamingChannelAdapterTests
* Different OSs can return files in different order, so add `Comparator` to the test
* Also decrease poll timeout for `null` expectation
2016-08-31 23:29:43 -04:00
Artem Bilan
a3923c93e7 XSD refactoring to pull common attributes
Also introduce `remote-file-separator` since this option is available via Java Config
2016-08-31 23:10:47 -04:00
Christian Tzolov
da77e4b89e Issue #30 : Add S3 inbound streaming channel adapter.
Fixes GH-30 (https://github.com/spring-projects/spring-integration-aws/issues/30)

* Add S3InboundStreamingMessageSource and related S3FileInfo
* Extend spring-integration-aws-1.1.xsd with s3-inbound-streaming-channel-adapter tag.
* Add S3StreamingInboundChannelAdapterParser and s3-inbound-streaming-channel-adapter handler.
* Add S3 streaming spring tests.
* Add S3 streaming documentation to README.md.

Issue #30: Resolve code style and formatting issues

Polishing:
* Revert some `build.gradle` changes
* Add JavaDoc to the `S3FileInfo.getPermissions()`
2016-08-31 22:43:39 -04:00
Artem Bilan
de4dfed908 Rename XSD to 1.1 version 2016-08-31 18:00:35 -04:00
Artem Bilan
a9a7b26dbf Start version 1.1.0
* Upgrade to SI-4.3.1
* Upgrade to SC-AWS-1.1.1
* Fix compatibility
2016-08-31 09:38:36 -04:00
Artem Bilan
8b9922d16c The S3 keyExpression assertions improvement 2016-08-29 14:54:04 -04:00
Artem Bilan
8e2fb5e921 Add start/stop queues management for SQS Adapter
Provide delegates for the SC-AWS `SimpleMessageListenerContainer` `start/stop/isRunning` method for individual queues.

Mark `SqsMessageDrivenChannelAdapter` with `@ManagedResource` and `@IntegrationManagedResource` to make those operation accessible from JMX/ControlBus
Cover the change with test-case
Provide some upgrades
Fix test for NPE from AWS SDK around `lastModified`: https://github.com/aws/aws-sdk-java/issues/822
2016-08-23 19:28:51 -04:00
Jim Krygowski
72821bfb8c GH-45: Fix S3 hierarchy support
Fixes GH-45 (https://github.com/spring-projects/spring-integration-aws/issues/45)

S3InboundFileSynchronizer failing when processing through S3 directories - modified approach for splitPathToBucketAndKey to account for the fact that there will be more than one forward slash in the path when subdirectories are used in an S3 bucket. Set up split operation to use the limit parameter to force the bucket identifier into the first element and the remainder of the text (the key) into the second element.

* modified unit test to include subdirectories.
*fixed additional usages of the split operation without the match limit parameter. DRY'd up some code. Cleaned up unit tests.

* added @author annotation at project lead's request.

Add some polishing
2016-08-11 16:32:06 -04:00
Spring Buildmaster
6a79933266 [artifactory-release] Next development version 2016-07-25 16:20:14 +00:00
Spring Buildmaster
5fcf343f99 [artifactory-release] Release version 1.0.0.RELEASE 2016-07-25 16:20:11 +00:00
Artem Bilan
b5292dc761 Introduce AwsHeaders.ACKNOWLEDGMENT for SQS 2016-07-14 17:31:23 -04:00
John Logan
b5e6cdaa95 GH-41: Fix broken S3 File upload
Fixes GH-41 (https://github.com/spring-projects/spring-integration-aws/issues/41)
Fixes GH-43 (https://github.com/spring-projects/spring-integration-aws/issues/43)

- Prior upload() code was trying to reset() a
  FileInputStream and then upload to S3, which
  resulted in zero uploaded bytes.
- Added dependency on spring-cloud-aws-core
  to resolve ResourceIdResolver reference.
- Fail if InputStream payload does not support
  mark/reset.
- Add metadata for byte array payload.

GH-41: Fix assert order per PR comments.
2016-07-13 16:48:53 -04:00
Gary Russell
07e8d59c1f CLA Hook 2016-07-11 15:37:13 +01:00
Artem Bilan
32070dbf92 Upgrade to Gradle 2.14 2016-06-23 12:55:47 -04:00
Kamil Przerwa
97988bdec5 GH-39: Allow text/plain for SNS Inbound
Fixes GH-39 (https://github.com/spring-projects/spring-integration-aws/issues/39)

Amazon SNS HTTP notifications are sent with the `content-type` header as `text/plain`, not `application/json` as it is expected by the `MappingJackson2HttpMessageConverter` by default.

*Added `text/plain` as supported content type for SNS inbound notification

* Corrections after review
2016-06-23 12:44:14 -04:00
Spring Buildmaster
0d52b9d352 [artifactory-release] Next development version 2016-06-14 21:31:28 +00:00
Spring Buildmaster
0f77a84fa5 [artifactory-release] Release version 1.0.0.M2 2016-06-14 21:31:25 +00:00
Patrick Fitzsimons
7be94b7690 GH-36: Add SqsMessageDrivenCA.queueStopTimeout
Fixes GH-36 (https://github.com/spring-projects/spring-integration-aws/issues/36)

* Add ability to set `queueStopTimeout` for `SimpleMessageListenerContainer` in `SqsMessageDrivenChannelAdapter`
* Update unit tests to test `queueStopTimeout`
* Ensure that we don't override the default `queueStopTimeout` with `0` `long`
* Upgrade to `SI-4.2.8`
2016-06-14 17:19:14 -04:00
Patrick Fitzsimons
d2aa5224ec Adding auto start up setter on sqsMessageDrivenChannelAdapter.java
Update tests in SqsMessageDrivenChannelAdapterParserTests to invoke setAutoStartup

Change setAutoStartUp to invoke super in SqsMessageDrivenChannelAdapter

Add override to SqsMessageDrivenChannelAdapter

Remove call to setAutoStartup in SqsMessageDrivenChannelAdapterParserTests
2016-06-08 21:47:05 -04:00