X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2FEndlessProducer.java;fp=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2FEndlessProducer.java;h=fcf42de3eebc8bf22c3dd1f3eb9cc43ecb30a32f;hb=053b38adcd1607bf4ddac5bd7039bd05dd3f55c7;hp=6b429548c42b23e5c389ac34c7fe7b673a027fee;hpb=59e6285162b2b441f68c25ba4c969802faf44a2d;p=demos%2Fkafka%2Ftraining diff --git a/src/main/java/de/juplo/kafka/EndlessProducer.java b/src/main/java/de/juplo/kafka/EndlessProducer.java index 6b42954..fcf42de 100644 --- a/src/main/java/de/juplo/kafka/EndlessProducer.java +++ b/src/main/java/de/juplo/kafka/EndlessProducer.java @@ -9,7 +9,6 @@ import javax.annotation.PreDestroy; import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; @Slf4j @@ -18,14 +17,12 @@ public class EndlessProducer implements Runnable private final ExecutorService executor; private final String id; private final String topic; - private final String acks; private final int throttleMs; private final KafkaProducer producer; private boolean running = false; private long i = 0; private long produced = 0; - private Future future = null; public EndlessProducer( ExecutorService executor, @@ -38,13 +35,13 @@ public class EndlessProducer implements Runnable this.executor = executor; this.id = clientId; this.topic = topic; - this.acks = acks; this.throttleMs = throttleMs; Properties props = new Properties(); props.put("bootstrap.servers", bootstrapServer); props.put("client.id", clientId); props.put("acks", acks); + props.put("metadata.max.age.ms", "1000"); props.put("partitioner.class", "org.apache.kafka.clients.producer.RoundRobinPartitioner"); props.put("key.serializer", StringSerializer.class.getName()); props.put("value.serializer", StringSerializer.class.getName()); @@ -59,54 +56,7 @@ public class EndlessProducer implements Runnable { for (; running; i++) { - final long time = System.currentTimeMillis(); - - final ProducerRecord record = new ProducerRecord<>( - topic, // Topic - Long.toString(i % 10), // Key - Long.toString(i) // Value - ); - - producer.send(record, (metadata, e) -> - { - long now = System.currentTimeMillis(); - if (e == null) - { - // HANDLE SUCCESS - produced++; - log.debug( - "{} - Sent key={} message={} partition={}/{} timestamp={} latency={}ms", - id, - record.key(), - record.value(), - metadata.partition(), - metadata.offset(), - metadata.timestamp(), - now - time - ); - } - else - { - // HANDLE ERROR - log.error( - "{} - ERROR key={} timestamp={} latency={}ms: {}", - id, - record.key(), - metadata == null ? -1 : metadata.timestamp(), - now - time, - e.toString() - ); - } - }); - - long now = System.currentTimeMillis(); - log.trace( - "{} - Queued #{} key={} latency={}ms", - id, - i, - record.key(), - now - time - ); + send(Long.toString(i%10), Long.toString(i)); if (throttleMs > 0) { @@ -125,10 +75,70 @@ public class EndlessProducer implements Runnable } catch (Exception e) { - + log.error("{} - Unexpected Exception:", id, e); + } + finally + { + synchronized (this) + { + running = false; + log.info("{} - Stopped - produced {} messages so far", id, produced); + } } } + void send(String key, String value) + { + final long time = System.currentTimeMillis(); + + final ProducerRecord record = new ProducerRecord<>( + topic, // Topic + key, // Key + value // Value + ); + + producer.send(record, (metadata, e) -> + { + long now = System.currentTimeMillis(); + if (e == null) + { + // HANDLE SUCCESS + produced++; + log.debug( + "{} - Sent key={} message={} partition={}/{} timestamp={} latency={}ms", + id, + record.key(), + record.value(), + metadata.partition(), + metadata.offset(), + metadata.timestamp(), + now - time + ); + } + else + { + // HANDLE ERROR + log.error( + "{} - ERROR key={} timestamp={} latency={}ms: {}", + id, + record.key(), + metadata == null ? -1 : metadata.timestamp(), + now - time, + e.toString() + ); + } + }); + + long now = System.currentTimeMillis(); + log.trace( + "{} - Queued #{} key={} latency={}ms", + id, + value, + record.key(), + now - time + ); + } + public synchronized void start() { if (running) @@ -136,7 +146,7 @@ public class EndlessProducer implements Runnable log.info("{} - Starting - produced {} messages before", id, produced); running = true; - future = executor.submit(this); + executor.submit(this); } public synchronized void stop() throws ExecutionException, InterruptedException @@ -146,8 +156,6 @@ public class EndlessProducer implements Runnable log.info("{} - Stopping...", id); running = false; - future.get(); - log.info("{} - Stopped - produced {} messages so far", id, produced); } @PreDestroy