X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2FApplicationRecordHandler.java;h=207578193005d77640d78b9b30ea08f25153d5fc;hb=refs%2Fheads%2Fsumup-adder--springified;hp=d0d385ca9f3ed0f94da4a5af058f1da0adc8a19e;hpb=a2e8fc924e5b472d6b90c42d311514f91ea452f1;p=demos%2Fkafka%2Ftraining diff --git a/src/main/java/de/juplo/kafka/ApplicationRecordHandler.java b/src/main/java/de/juplo/kafka/ApplicationRecordHandler.java index d0d385c..2075781 100644 --- a/src/main/java/de/juplo/kafka/ApplicationRecordHandler.java +++ b/src/main/java/de/juplo/kafka/ApplicationRecordHandler.java @@ -1,54 +1,84 @@ package de.juplo.kafka; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.kafka.annotation.KafkaHandler; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.support.KafkaHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; +import java.time.Duration; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +@RequiredArgsConstructor @Slf4j -public class ApplicationRecordHandler implements RecordHandler +@KafkaListener( + id = "${spring.kafka.consumer.group-id}", + topics = "${sumup.adder.topic}") +public class ApplicationRecordHandler { + private final AdderResults results; + private final Optional throttle; + private final String id; + private final Map state = new HashMap<>(); - @Override - public void accept(ConsumerRecord record) + @KafkaHandler + public void addNumber( + @Header(KafkaHeaders.RECEIVED_PARTITION_ID) + Integer partition, + @Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) + String user, + @Payload + MessageAddNumber message) { - Integer partition = record.partition(); - String user = record.key(); - String message = record.value(); - switch (message) - { - case "START": - state.get(partition).startSum(user); - break; - - case "END": - Long result = state.get(partition).endSum(user); - log.info("New result for {}: {}", user, result); - break; - - default: - state.get(partition).addToSum(user, Integer.parseInt(message)); - break; - } + log.debug("{} - Received {} for {} on {}", id, message, user, partition); + state.get(partition).addToSum(user, message.getNext()); + throttle(); } - protected void addPartition(Integer partition, Map state) + @KafkaHandler + public void calculateSum( + @Header(KafkaHeaders.RECEIVED_PARTITION_ID) + Integer partition, + @Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) + String user, + @Payload + MessageCalculateSum message) { - this.state.put(partition, new AdderBusinessLogic(state)); + AdderResult result = state.get(partition).calculate(user); + log.info("{} - New result for {}: {}", id, user, result); + results.addResults(partition, user, result); + throttle(); } - protected Map removePartition(Integer partition) + private void throttle() { - return this.state.remove(partition).getState(); + if (throttle.isPresent()) + { + try + { + Thread.sleep(throttle.get().toMillis()); + } + catch (InterruptedException e) + { + log.warn("{} - Intrerrupted while throttling: {}", id, e); + } + } } + protected void addPartition(Integer partition, Map state) + { + this.state.put(partition, new AdderBusinessLogic(state)); + } - public Map getState() + protected Map removePartition(Integer partition) { - return state; + return this.state.remove(partition).getState(); } }