|
41 | 41 | import java.util.concurrent.CompletionException; |
42 | 42 | import java.util.concurrent.atomic.AtomicInteger; |
43 | 43 | import java.util.function.Consumer; |
| 44 | +import java.util.stream.Collectors; |
44 | 45 | import java.util.stream.IntStream; |
45 | 46 | import org.junit.jupiter.api.BeforeEach; |
46 | 47 | import org.junit.jupiter.api.Test; |
@@ -681,104 +682,32 @@ void shouldGroupMessagesByMessageGroupIdForFifoQueues() { |
681 | 682 |
|
682 | 683 | @Test |
683 | 684 | void shouldBinPackSmallFifoGroupsIntoSharedBatches() { |
684 | | - String queue = "test-queue.fifo"; |
685 | | - String groupA = "group-a"; |
686 | | - String groupB = "group-b"; |
687 | | - String groupC = "group-c"; |
688 | | - String groupD = "group-d"; |
689 | | - List<Message<String>> messages = new ArrayList<>(); |
690 | | - messages.addAll(createMessagesForGroup(groupA, 3)); |
691 | | - messages.addAll(createMessagesForGroup(groupB, 3)); |
692 | | - messages.addAll(createMessagesForGroup(groupC, 3)); |
693 | | - messages.addAll(createMessagesForGroup(groupD, 3)); |
694 | | - |
695 | | - GetQueueUrlResponse urlResponse = GetQueueUrlResponse.builder().queueUrl(queue).build(); |
696 | | - given(mockClient.getQueueUrl(any(GetQueueUrlRequest.class))) |
697 | | - .willReturn(CompletableFuture.completedFuture(urlResponse)); |
698 | | - mockQueueAttributes(mockClient, Map.of()); |
699 | | - |
700 | | - List<SendMessageBatchRequest> captured = new ArrayList<>(); |
701 | | - given(mockClient.sendMessageBatch(any(SendMessageBatchRequest.class))).willAnswer(invocation -> { |
702 | | - SendMessageBatchRequest request = invocation.getArgument(0); |
703 | | - captured.add(request); |
704 | | - return CompletableFuture.completedFuture( |
705 | | - SendMessageBatchResponse.builder().successful(successEntries(request.entries())).build()); |
706 | | - }); |
707 | | - |
708 | | - SqsOperations template = SqsTemplate.newSyncTemplate(mockClient); |
709 | | - SendResult.Batch<String> result = template.sendMany(queue, messages); |
710 | | - |
711 | | - assertThat(result.successful()).hasSize(12); |
712 | | - assertThat(result.failed()).isEmpty(); |
713 | | - assertThat(captured).hasSize(2); |
714 | | - assertThat(captured.get(0).entries()).hasSize(9); |
715 | | - assertThat(captured.get(1).entries()).hasSize(3); |
| 685 | + var groups = new ArrayList<>(List.of(sqsMessages(3), sqsMessages(3), sqsMessages(3), sqsMessages(3))); |
| 686 | + var packed = SqsTemplate.binPackSmallFifoGroups(groups, 10); |
| 687 | + assertThat(packed).hasSize(2); |
| 688 | + assertThat(packed.get(0)).hasSize(9); |
| 689 | + assertThat(packed.get(1)).hasSize(3); |
716 | 690 | } |
717 | 691 |
|
718 | 692 | @Test |
719 | | - void shouldBinPackFifoGroupsOfDifferentSizes() { |
720 | | - String queue = "test-queue.fifo"; |
721 | | - List<Message<String>> messages = new ArrayList<>(); |
722 | | - messages.addAll(createMessagesForGroup("group-4", 4)); |
723 | | - messages.addAll(createMessagesForGroup("group-6", 6)); |
724 | | - |
725 | | - GetQueueUrlResponse urlResponse = GetQueueUrlResponse.builder().queueUrl(queue).build(); |
726 | | - given(mockClient.getQueueUrl(any(GetQueueUrlRequest.class))) |
727 | | - .willReturn(CompletableFuture.completedFuture(urlResponse)); |
728 | | - mockQueueAttributes(mockClient, Map.of()); |
729 | | - |
730 | | - List<SendMessageBatchRequest> captured = new ArrayList<>(); |
731 | | - given(mockClient.sendMessageBatch(any(SendMessageBatchRequest.class))).willAnswer(invocation -> { |
732 | | - SendMessageBatchRequest request = invocation.getArgument(0); |
733 | | - captured.add(request); |
734 | | - return CompletableFuture.completedFuture( |
735 | | - SendMessageBatchResponse.builder().successful(successEntries(request.entries())).build()); |
736 | | - }); |
737 | | - |
738 | | - SqsOperations template = SqsTemplate.newSyncTemplate(mockClient); |
739 | | - SendResult.Batch<String> result = template.sendMany(queue, messages); |
740 | | - |
741 | | - assertThat(result.successful()).hasSize(10); |
742 | | - assertThat(result.failed()).isEmpty(); |
743 | | - assertThat(captured).hasSize(1); |
744 | | - assertThat(captured.get(0).entries()).hasSize(10); |
| 693 | + void shouldPackGroupsThatFitExactly() { |
| 694 | + var groups = new ArrayList<>(List.of(sqsMessages(4), sqsMessages(6))); |
| 695 | + var packed = SqsTemplate.binPackSmallFifoGroups(groups, 10); |
| 696 | + assertThat(packed).hasSize(1); |
| 697 | + assertThat(packed.get(0)).hasSize(10); |
745 | 698 | } |
746 | 699 |
|
747 | 700 | @Test |
748 | | - void shouldBinPackLargeAndSmallGroupsTogether() { |
749 | | - String queue = "test-queue.fifo"; |
750 | | - List<Message<String>> messages = new ArrayList<>(); |
751 | | - messages.addAll(createMessagesForGroup("large-a", 15)); |
752 | | - messages.addAll(createMessagesForGroup("large-b", 12)); |
753 | | - messages.addAll(createMessagesForGroup("small-a", 3)); |
754 | | - messages.addAll(createMessagesForGroup("small-b", 2)); |
755 | | - |
756 | | - GetQueueUrlResponse urlResponse = GetQueueUrlResponse.builder().queueUrl(queue).build(); |
757 | | - given(mockClient.getQueueUrl(any(GetQueueUrlRequest.class))) |
758 | | - .willReturn(CompletableFuture.completedFuture(urlResponse)); |
759 | | - mockQueueAttributes(mockClient, Map.of()); |
760 | | - |
761 | | - List<SendMessageBatchRequest> captured = new ArrayList<>(); |
762 | | - given(mockClient.sendMessageBatch(any(SendMessageBatchRequest.class))).willAnswer(invocation -> { |
763 | | - SendMessageBatchRequest request = invocation.getArgument(0); |
764 | | - captured.add(request); |
765 | | - return CompletableFuture.completedFuture( |
766 | | - SendMessageBatchResponse.builder().successful(successEntries(request.entries())).build()); |
767 | | - }); |
768 | | - |
769 | | - SqsOperations template = SqsTemplate.newSyncTemplate(mockClient); |
770 | | - SendResult.Batch<String> result = template.sendMany(queue, messages); |
771 | | - |
772 | | - assertThat(result.successful()).hasSize(32); |
773 | | - assertThat(result.failed()).isEmpty(); |
774 | | - assertThat(captured).hasSize(5); |
| 701 | + void shouldSeparateSmallGroupsWhenBatchIsFull() { |
| 702 | + var groups = new ArrayList<>(List.of(sqsMessages(6), sqsMessages(5), sqsMessages(5))); |
| 703 | + var packed = SqsTemplate.binPackSmallFifoGroups(groups, 10); |
| 704 | + assertThat(packed).hasSize(2); |
775 | 705 | } |
776 | 706 |
|
777 | | - private static List<Message<String>> createMessagesForGroup(String groupId, int count) { |
| 707 | + private static List<software.amazon.awssdk.services.sqs.model.Message> sqsMessages(int count) { |
778 | 708 | return IntStream.range(0, count) |
779 | | - .mapToObj(i -> MessageBuilder.withPayload("payload-" + groupId + "-" + i) |
780 | | - .setHeader(SqsHeaders.MessageSystemAttributes.SQS_MESSAGE_GROUP_ID_HEADER, groupId).build()) |
781 | | - .toList(); |
| 709 | + .mapToObj(i -> software.amazon.awssdk.services.sqs.model.Message.builder().build()) |
| 710 | + .collect(Collectors.toCollection(ArrayList::new)); |
782 | 711 | } |
783 | 712 |
|
784 | 713 | @Test |
|
0 commit comments