package de.juplo.kafka;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
+import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
+@RequiredArgsConstructor
@Slf4j
-public class ApplicationRecordHandler implements RecordHandler<String, String>
+public class ApplicationRecordHandler implements RecordHandler<String, Message>
{
+ private final AdderResults results;
+ private final Optional<Duration> throttle;
+ private final String id;
+
private final Map<Integer, AdderBusinessLogic> state = new HashMap<>();
+ public void addNumber(
+ Integer partition,
+ String user,
+ MessageAddNumber message)
+ {
+ state.get(partition).addToSum(user, message.getNext());
+ }
+
+ public void calculateSum(
+ Integer partition,
+ String user,
+ MessageCalculateSum message)
+ {
+ AdderResult result = state.get(partition).calculate(user);
+ log.info("{} - New result for {}: {}", id, user, result);
+ results.addResults(partition, user, result);
+ }
+
@Override
- public void accept(ConsumerRecord<String, String> record)
+ public void accept(ConsumerRecord<String, Message> record)
{
Integer partition = record.partition();
String user = record.key();
- String message = record.value();
+ Message message = record.value();
- if (message.equals("CALCULATE"))
+ switch(message.getType())
{
- Long result = state.get(partition).calculate(user);
- log.info("New result for {}: {}", user, result);
- return;
+ case ADD:
+ addNumber(partition, user, (MessageAddNumber) message);
+ break;
+
+ case CALC:
+ calculateSum(partition, user, (MessageCalculateSum) message);
+ break;
}
- state.get(partition).addToSum(user, Integer.parseInt(message));
+ 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<String, Long> state)
+ protected void addPartition(Integer partition, Map<String, AdderResult> state)
{
this.state.put(partition, new AdderBusinessLogic(state));
}
- protected Map<String, Long> removePartition(Integer partition)
+ protected Map<String, AdderResult> removePartition(Integer partition)
{
return this.state.remove(partition).getState();
}
{
return state;
}
+
+ public AdderBusinessLogic getState(Integer partition)
+ {
+ return state.get(partition);
+ }
}