7474/**
7575 * @author Artem Bilan
7676 * @author Matthias Wesolowski
77+ * @author Greg Eales
78+ *
7779 * @since 1.1
7880 */
7981@ SpringJUnitConfig
@@ -93,6 +95,9 @@ public class KinesisMessageDrivenChannelAdapterTests {
9395 @ Autowired
9496 private MetadataStore checkpointStore ;
9597
98+ @ Autowired
99+ private MetadataStore reshardingCheckpointStore ;
100+
96101 @ Autowired
97102 private KinesisMessageDrivenChannelAdapter reshardingChannelAdapter ;
98103
@@ -108,7 +113,7 @@ void setup() {
108113 }
109114
110115 @ Test
111- @ SuppressWarnings ({"unchecked" , "rawtypes" })
116+ @ SuppressWarnings ({ "unchecked" , "rawtypes" })
112117 void testKinesisMessageDrivenChannelAdapter () {
113118 this .kinesisMessageDrivenChannelAdapter .start ();
114119 final Set <KinesisShardOffset > shardOffsets = TestUtils .getPropertyValue (this .kinesisMessageDrivenChannelAdapter ,
@@ -219,11 +224,14 @@ void testResharding() throws InterruptedException {
219224
220225 this .reshardingChannelAdapter .stop ();
221226
227+ assertThat (this .reshardingCheckpointStore .get ("SpringIntegration:streamForResharding:closedEmptyShard5" ))
228+ .isEqualTo ("50" );
229+
222230 KinesisShardEndedEvent kinesisShardEndedEvent = this .config .shardEndedEventReference .get ();
223231
224232 assertThat (kinesisShardEndedEvent ).isNotNull ()
225233 .extracting (KinesisShardEndedEvent ::getShardKey )
226- .isEqualTo ("SpringIntegration:streamForResharding:closedShard4 " );
234+ .isEqualTo ("SpringIntegration:streamForResharding:closedEmptyShard5 " );
227235 }
228236
229237 @ Configuration
@@ -336,39 +344,51 @@ public AmazonKinesis amazonKinesisForResharding() {
336344 .willReturn (new ListShardsResult ()
337345 .withShards (
338346 new Shard ().withShardId ("closedShard1" )
339- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("1" ))))
347+ .withSequenceNumberRange (new SequenceNumberRange ()
348+ .withEndingSequenceNumber ("10" ))))
340349 .willReturn (new ListShardsResult ()
341350 .withShards (
342351 new Shard ().withShardId ("closedShard1" )
343- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("1" )),
352+ .withSequenceNumberRange (new SequenceNumberRange ()
353+ .withEndingSequenceNumber ("10" )),
344354 new Shard ().withShardId ("newShard2" )
345- .withSequenceNumberRange (new SequenceNumberRange (). withEndingSequenceNumber ( "2" ) ),
355+ .withSequenceNumberRange (new SequenceNumberRange ()),
346356 new Shard ().withShardId ("newShard3" )
347- .withSequenceNumberRange (new SequenceNumberRange (). withEndingSequenceNumber ( "3" ) ),
357+ .withSequenceNumberRange (new SequenceNumberRange ()),
348358 new Shard ().withShardId ("closedShard4" )
349- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("4" ))))
359+ .withSequenceNumberRange (new SequenceNumberRange ()
360+ .withEndingSequenceNumber ("40" )),
361+ new Shard ().withShardId ("closedEmptyShard5" )
362+ .withSequenceNumberRange (new SequenceNumberRange ()
363+ .withEndingSequenceNumber ("50" ))))
350364 .willReturn (new ListShardsResult ()
351365 .withShards (
352366 new Shard ().withShardId ("closedShard1" )
353- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("1" )),
367+ .withSequenceNumberRange (new SequenceNumberRange ()
368+ .withEndingSequenceNumber ("10" )),
354369 new Shard ().withShardId ("newShard2" )
355- .withSequenceNumberRange (new SequenceNumberRange (). withEndingSequenceNumber ( "2" ) ),
370+ .withSequenceNumberRange (new SequenceNumberRange ()),
356371 new Shard ().withShardId ("newShard3" )
357- .withSequenceNumberRange (new SequenceNumberRange (). withEndingSequenceNumber ( "3" ) ),
372+ .withSequenceNumberRange (new SequenceNumberRange ()),
358373 new Shard ().withShardId ("closedShard4" )
359- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("4" )),
360- new Shard ().withShardId ("newShard5" )
361- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("5" )),
374+ .withSequenceNumberRange (new SequenceNumberRange ()
375+ .withEndingSequenceNumber ("40" )),
376+ new Shard ().withShardId ("closedEmptyShard5" )
377+ .withSequenceNumberRange (new SequenceNumberRange ()
378+ .withEndingSequenceNumber ("50" )),
362379 new Shard ().withShardId ("newShard6" )
363- .withSequenceNumberRange (new SequenceNumberRange ().withEndingSequenceNumber ("6" ))));
380+ .withSequenceNumberRange (new SequenceNumberRange ()),
381+ new Shard ().withShardId ("newShard7" )
382+ .withSequenceNumberRange (new SequenceNumberRange ())));
364383
365384
366385 setClosedShard (amazonKinesis , "1" );
367386 setNewShard (amazonKinesis , "2" );
368387 setNewShard (amazonKinesis , "3" );
369388 setClosedShard (amazonKinesis , "4" );
370- setNewShard (amazonKinesis , "5" );
389+ setClosedEmptyShard (amazonKinesis , "5" );
371390 setNewShard (amazonKinesis , "6" );
391+ setNewShard (amazonKinesis , "7" );
372392
373393 return amazonKinesis ;
374394 }
@@ -377,7 +397,8 @@ private void setClosedShard(AmazonKinesis amazonKinesis, String shardIndex) {
377397 String shardIterator = String .format ("shard%sIterator1" , shardIndex );
378398
379399 given (amazonKinesis .getShardIterator (
380- KinesisShardOffset .latest (STREAM_FOR_RESHARDING , "closedShard" + shardIndex ).toShardIteratorRequest ()))
400+ KinesisShardOffset .latest (STREAM_FOR_RESHARDING , "closedShard" + shardIndex )
401+ .toShardIteratorRequest ()))
381402 .willReturn (new GetShardIteratorResult ().withShardIterator (shardIterator ));
382403
383404 given (amazonKinesis .getRecords (new GetRecordsRequest ().withShardIterator (shardIterator ).withLimit (25 )))
@@ -386,6 +407,18 @@ private void setClosedShard(AmazonKinesis amazonKinesis, String shardIndex) {
386407 .withData (ByteBuffer .wrap ("foo" .getBytes ()))));
387408 }
388409
410+ private void setClosedEmptyShard (AmazonKinesis amazonKinesis , String shardIndex ) {
411+ String shardIterator = String .format ("shard%sIterator1" , shardIndex );
412+
413+ given (amazonKinesis .getShardIterator (
414+ KinesisShardOffset .latest (STREAM_FOR_RESHARDING , "closedEmptyShard" + shardIndex )
415+ .toShardIteratorRequest ()))
416+ .willReturn (new GetShardIteratorResult ().withShardIterator (shardIterator ));
417+
418+ given (amazonKinesis .getRecords (new GetRecordsRequest ().withShardIterator (shardIterator ).withLimit (25 )))
419+ .willReturn (new GetRecordsResult ().withNextShardIterator (null ));
420+ }
421+
389422 private void setNewShard (AmazonKinesis amazonKinesis , String shardIndex ) {
390423 String shardIterator1 = String .format ("shard%sIterator1" , shardIndex );
391424 String shardIterator2 = String .format ("shard%sIterator2" , shardIndex );
@@ -405,6 +438,11 @@ private void setNewShard(AmazonKinesis amazonKinesis, String shardIndex) {
405438 .willReturn (new GetShardIteratorResult ().withShardIterator (shardIterator2 ));
406439 }
407440
441+ @ Bean
442+ public ConcurrentMetadataStore reshardingCheckpointStore () {
443+ return new SimpleMetadataStore ();
444+ }
445+
408446 @ Bean
409447 public KinesisMessageDrivenChannelAdapter reshardingChannelAdapter () {
410448 KinesisMessageDrivenChannelAdapter adapter = new KinesisMessageDrivenChannelAdapter (
@@ -415,6 +453,7 @@ public KinesisMessageDrivenChannelAdapter reshardingChannelAdapter() {
415453 adapter .setDescribeStreamRetries (1 );
416454 adapter .setRecordsLimit (25 );
417455 adapter .setConcurrency (1 );
456+ adapter .setCheckpointStore (reshardingCheckpointStore ());
418457
419458 DirectFieldAccessor dfa = new DirectFieldAccessor (adapter );
420459 dfa .setPropertyValue ("describeStreamBackoff" , 10 );
0 commit comments