package com.amazonaws.services.kinesis.producer.demo; import java.util.ArrayList; import java.util.List; import java.util.Optional; import com.amazonaws.services.kinesis.model.PutRecordsRequest; import com.amazonaws.services.kinesis.model.PutRecordsRequestEntry; public class RecordBatcher { private List<PutRecordsRequestEntry> entries = new ArrayList<>(); private int requestSize = 0; private final int maxCount; private final int maxSize; public RecordBatcher() { this(500, 5 * 1024 * 1024); } public RecordBatcher(int maxCount, int maxSize) { this.maxCount = maxCount; this.maxSize = maxSize; } public Optional<PutRecordsRequest> put(PutRecordsRequestEntry entry) { int newRequestSize = requestSize + entry.getData().remaining() + entry.getPartitionKey().length(); if (entries.size() < maxCount && newRequestSize <= maxSize) { requestSize = newRequestSize; entries.add(entry); return Optional.empty(); } else { Optional<PutRecordsRequest> ret = flush(); put(entry); return ret; } } public Optional<PutRecordsRequest> flush() { if (entries.size() > 0) { PutRecordsRequest r = new PutRecordsRequest(); r.setRecords(entries); entries = new ArrayList<>(); requestSize = 0; return Optional.of(r); } else { return Optional.empty(); } } }