package com.amazonaws.services.kinesis.producer.demo; import java.time.Duration; import java.time.LocalDateTime; import java.util.Map; import java.util.Random; import java.util.TreeMap; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.xml.bind.DatatypeConverter; import org.apache.commons.lang.StringUtils; public class ClickEventsToKinesisTestDriver { private static Random RANDOM = new Random(); private static final Duration TEST_DURATION = Duration.ofSeconds(180); private static ClickEvent generateClickEvent() { byte[] id = new byte[13]; RANDOM.nextBytes(id); String data = StringUtils.repeat("a", 350); return new ClickEvent(DatatypeConverter.printBase64Binary(id), data); } public static void main(String[] args) throws Exception { final BlockingQueue<ClickEvent> events = new ArrayBlockingQueue<ClickEvent>(65536); final ExecutorService exec = Executors.newCachedThreadPool(); // Change this line to use a different implementation final AbstractClickEventsToKinesis worker = new BasicClickEventsToKinesis(events); exec.submit(worker); // Warm up the KinesisProducer instance if (worker instanceof KPLClickEventsToKinesis) { for (int i = 0; i < 200; i++) { events.offer(generateClickEvent()); } Thread.sleep(1000); } final LocalDateTime testStart = LocalDateTime.now(); final LocalDateTime testEnd = testStart.plus(TEST_DURATION); exec.submit(() -> { try { while (LocalDateTime.now().isBefore(testEnd)) { events.put(generateClickEvent()); } worker.stop(); // This will unblock worker if it's blocked on the queue events.offer(generateClickEvent()); exec.shutdown(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } }); // This reports the average records per second over a 10 second sliding window new Thread(() -> { Map<Long, Long> history = new TreeMap<>(); try { while (!exec.isTerminated()) { long seconds = Duration.between(testStart, LocalDateTime.now()).getSeconds(); long records = worker.recordsPut(); history.put(seconds, records); long windowStart = seconds - 10; long recordsAtWinStart = history.containsKey(windowStart) ? history.get(windowStart) : 0; double rps = (double)(records - recordsAtWinStart) / 10; System.out.println(String.format( "%d seconds, %d records total, %.2f RPS (avg last 10s)", seconds, records, rps)); Thread.sleep(1000); } System.out.println("Finished."); } catch (Exception e) { e.printStackTrace(); System.exit(1); } }).start(); } }