From b6baa42b80b9b1463511a764e3986ce7161ea9a0 Mon Sep 17 00:00:00 2001 From: binchoo <079111w@gmail.com> Date: Sat, 2 Jul 2022 16:13:36 +0900 Subject: [PATCH] #10 Adjust batch message build --- .../redeem/RedeemCodeDeliveryLambda.java | 49 +++++++++++-------- .../redeem/RedeemCodeDeliveryLambdaTest.java | 31 ++++++++++++ 2 files changed, 60 insertions(+), 20 deletions(-) diff --git a/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java b/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java index 0ef65b36..da6e3eda 100644 --- a/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java +++ b/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java @@ -12,15 +12,11 @@ import org.binchoo.paimonganyu.redeem.RedeemCode; import org.binchoo.paimonganyu.redeem.RedeemTask; import org.binchoo.paimonganyu.redeem.driving.RedeemTaskEstimationPort; -import org.binchoo.paimonganyu.redeem.options.RedeemTaskEstimationOption; import org.binchoo.paimonganyu.service.redeem.RedeemAllUsersOption; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; +import java.util.*; /** * @author : jbinchoo @@ -34,8 +30,8 @@ public class RedeemCodeDeliveryLambda { private AmazonS3 s3Client; private AmazonSQS sqsClient; private ObjectMapper objectMapper; - private RedeemTaskEstimationPort redeemTaskEstimationPort; - private UserHoyopassCrudPort userHoyopassCrudPort; + private RedeemTaskEstimationPort taskEstimation; + private UserHoyopassCrudPort userCrud; public RedeemCodeDeliveryLambda() { this.lookupDependencies(new AnnotationConfigApplicationContext(RedeemCodeDeliveryMain.class)); @@ -45,27 +41,40 @@ private void lookupDependencies(GenericApplicationContext context) { this.s3Client = context.getBean(AmazonS3.class); this.sqsClient = context.getBean(AmazonSQS.class); this.objectMapper = context.getBean(ObjectMapper.class); - this.redeemTaskEstimationPort = context.getBean(RedeemTaskEstimationPort.class); - this.userHoyopassCrudPort = context.getBean(UserHoyopassCrudPort.class); - Objects.requireNonNull(this.redeemTaskEstimationPort); - Objects.requireNonNull(this.userHoyopassCrudPort); + this.taskEstimation = context.getBean(RedeemTaskEstimationPort.class); + this.userCrud = context.getBean(UserHoyopassCrudPort.class); + Objects.requireNonNull(this.taskEstimation); + Objects.requireNonNull(this.userCrud); } public void handler(S3Event s3Event) { var eventWrapper = new S3EventObjectReader(s3Client); var redeemCodeList = eventWrapper.extractPojos(s3Event, RedeemCode.class); - RedeemTaskEstimationOption estimationOption = new RedeemAllUsersOption(userHoyopassCrudPort, - ()-> Collections.unmodifiableList(redeemCodeList)); - sendToQueue(redeemTaskEstimationPort.generateTasks(estimationOption)); + List tasks = taskEstimation.generateTasks(new RedeemAllUsersOption(userCrud, + ()-> Collections.unmodifiableList(redeemCodeList))); + sendToQueue(tasks); } private void sendToQueue(List redeemTasks) { - List batchMessage = new LinkedList<>(); - for (int i = 0; i < redeemTasks.size(); i++) { - batchMessage.add(new SendMessageBatchRequestEntry() - .withId(String.valueOf(i)) - .withMessageBody(redeemTasks.get(i).getJson(objectMapper))); + for (var batch : taskSplit(redeemTasks, 10)) + sqsClient.sendMessageBatch(CODEREDEEM_QUEUE_NAME, batch); + } + + protected List> taskSplit(List tasks, int batchSize) { + LinkedList taskQueue = new LinkedList<>(tasks); + List> batches = new ArrayList<>(); + while (taskQueue.size() > 0) { + List batch = new ArrayList<>(); + + int fetch = Math.min(batchSize, taskQueue.size()); + while (fetch-- > 0) { + RedeemTask task = taskQueue.removeFirst(); + SendMessageBatchRequestEntry entry = new SendMessageBatchRequestEntry( + task.getBotUserId(), task.getJson(objectMapper)); + batch.add(entry); + } + batches.add(batch); } - sqsClient.sendMessageBatch(CODEREDEEM_QUEUE_NAME, batchMessage); + return batches; } } diff --git a/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java b/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java index 0cae3c3a..caeedcb1 100644 --- a/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java +++ b/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java @@ -1,7 +1,15 @@ package org.binchoo.paimonganyu.lambda.redeem; +import net.bytebuddy.utility.RandomString; +import org.binchoo.paimonganyu.redeem.RedeemCode; +import org.binchoo.paimonganyu.redeem.RedeemTask; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + /** * @author : jbinchoo * @since : 2022-04-19 @@ -12,4 +20,27 @@ class RedeemCodeDeliveryLambdaTest { void bootstrap() { new RedeemCodeDeliveryLambda(); } + + @Test + void taskSplit() { + int n = 100, batchSize = 10; + int expectedBatches = (n % batchSize == 0)? n / batchSize : (n / batchSize + 1); + var codeDelivery = new RedeemCodeDeliveryLambda(); + var tasks = task(n); + + var batch = codeDelivery.taskSplit(tasks, batchSize); + + assertThat(batch).hasSize(expectedBatches); + System.out.println(batch); + } + + private List task(int n) { + List tasks = new ArrayList<>(); + while (n--> 0) + tasks.add(RedeemTask.builder() + .botUserId(RandomString.make()) + .redeemCode(new RedeemCode(RandomString.make())) + .build()); + return tasks; + } }