package de.juplo.demo.kafka.deduplication;
import lombok.extern.slf4j.Slf4j;
-import org.apache.kafka.common.header.Headers;
-import org.apache.kafka.streams.kstream.ValueTransformerWithKey;
+import org.apache.kafka.streams.kstream.ValueTransformer;
import org.apache.kafka.streams.processor.ProcessorContext;
import org.apache.kafka.streams.state.KeyValueStore;
@Slf4j
-public class DeduplicationTransformer<K, V> implements ValueTransformerWithKey<K, V, Iterable<V>>
+public class DeduplicationTransformer implements ValueTransformer<String, Iterable<String>>
{
- final SequenceNumberExtractor<K, V> extractor;
-
public final static String STORE = DeduplicationTransformer.class.getCanonicalName() + "_STORE";
private ProcessorContext context;
private KeyValueStore<Integer, Long> store;
- public DeduplicationTransformer(SequenceNumberExtractor<K, V> extractor)
- {
- this.extractor = extractor;
- }
-
-
@Override
public void init(ProcessorContext context)
{
}
@Override
- public Iterable<V> transform(K key, V value)
+ public Iterable<String> transform(String value)
{
- String topic = context.topic();
Integer partition = context.partition();
- long offset = context.offset();
- Headers headers = context.headers();
-
- long sequenceNumber = extractor.extract(topic, partition, offset, headers, key, value);
+ long sequenceNumber = Long.parseLong(value);
Long seen = store.get(partition);
if (seen == null || seen < sequenceNumber)
return Arrays.asList(value);
}
- log.info(
- "ignoring message for key {} with sequence-number {} <= {} found at offset {} of partition {}",
- key,
- sequenceNumber,
- seen,
- offset,
- partition);
+ log.info("ignoring message with sequence-number {} <= {}", sequenceNumber, seen);
// Signal, that the message has already been seen.
// Downstream has to filter the null-values...