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;
@RequiredArgsConstructor
@Slf4j
-public class ApplicationRecordHandler implements RecordHandler<String, String>
+@KafkaListener(
+ id = "${spring.kafka.consumer.group-id}",
+ topics = "${sumup.adder.topic}")
+public class ApplicationRecordHandler
{
private final AdderResults results;
private final Optional<Duration> throttle;
private final Map<Integer, AdderBusinessLogic> state = new HashMap<>();
- @Override
- public void accept(ConsumerRecord<String, String> 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();
+ log.debug("{} - Received {} for {} on {}", id, message, user, partition);
+ state.get(partition).addToSum(user, message.getNext());
+ throttle();
+ }
- if (message.equals("CALCULATE"))
- {
- AdderResult result = state.get(partition).calculate(user);
- log.info("{} - New result for {}: {}", id, user, result);
- results.addResults(partition, user, result);
- }
- else
- {
- state.get(partition).addToSum(user, Integer.parseInt(message));
- }
+ @KafkaHandler
+ public void calculateSum(
+ @Header(KafkaHeaders.RECEIVED_PARTITION_ID)
+ Integer partition,
+ @Header(KafkaHeaders.RECEIVED_MESSAGE_KEY)
+ String user,
+ @Payload
+ MessageCalculateSum message)
+ {
+ AdderResult result = state.get(partition).calculate(user);
+ log.info("{} - New result for {}: {}", id, user, result);
+ results.addResults(partition, user, result);
+ throttle();
+ }
+ private void throttle()
+ {
if (throttle.isPresent())
{
try
{
return this.state.remove(partition).getState();
}
-
-
- public Map<Integer, AdderBusinessLogic> getState()
- {
- return state;
- }
-
- public AdderBusinessLogic getState(Integer partition)
- {
- return state.get(partition);
- }
}