Skip to content

Commit

Permalink
#10 Adjust batch message build
Browse files Browse the repository at this point in the history
  • Loading branch information
binchoo committed Jul 2, 2022
1 parent cc8a376 commit b6baa42
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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));
Expand All @@ -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<RedeemTask> tasks = taskEstimation.generateTasks(new RedeemAllUsersOption(userCrud,
()-> Collections.unmodifiableList(redeemCodeList)));
sendToQueue(tasks);
}

private void sendToQueue(List<RedeemTask> redeemTasks) {
List<SendMessageBatchRequestEntry> 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<List<SendMessageBatchRequestEntry>> taskSplit(List<RedeemTask> tasks, int batchSize) {
LinkedList<RedeemTask> taskQueue = new LinkedList<>(tasks);
List<List<SendMessageBatchRequestEntry>> batches = new ArrayList<>();
while (taskQueue.size() > 0) {
List<SendMessageBatchRequestEntry> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<RedeemTask> task(int n) {
List<RedeemTask> tasks = new ArrayList<>();
while (n--> 0)
tasks.add(RedeemTask.builder()
.botUserId(RandomString.make())
.redeemCode(new RedeemCode(RandomString.make()))
.build());
return tasks;
}
}

0 comments on commit b6baa42

Please sign in to comment.