X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2FSimpleProducer.java;h=fd03d732d0d53ba46b463f8dd907edc9d410e1cc;hb=7eb2c864e132b2e1b14c7971d06b4b2c960b4170;hp=5f5792581d860a8b119e5e561250929bc8f35319;hpb=d4bf2b7400df95df6c3f2534519671e596163be2;p=demos%2Fkafka%2Ftraining diff --git a/src/main/java/de/juplo/kafka/SimpleProducer.java b/src/main/java/de/juplo/kafka/SimpleProducer.java index 5f57925..fd03d73 100644 --- a/src/main/java/de/juplo/kafka/SimpleProducer.java +++ b/src/main/java/de/juplo/kafka/SimpleProducer.java @@ -11,78 +11,141 @@ import java.util.Properties; @Slf4j public class SimpleProducer { - public static void main(String[] args) throws Exception + private final String id; + private final String topic; + private final KafkaProducer producer; + + private long produced = 0; + private volatile boolean running = true; + private volatile boolean done = false; + + public SimpleProducer(String broker, String topic, String id) { - // tag::create[] Properties props = new Properties(); - props.put("bootstrap.servers", "localhost:9092"); + props.put("bootstrap.servers", broker); + props.put("client.id", id); // Nur zur Wiedererkennung props.put("key.serializer", StringSerializer.class.getName()); props.put("value.serializer", StringSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - // end::create[] + producer = new KafkaProducer<>(props); - String id = "P"; + this.topic = topic; + this.id = id; + } + + public void run() + { long i = 0; try { - for (; i < 100 ; i++) + for (; running ; i++) { - final long time = System.currentTimeMillis(); + send(Long.toString(i%10), Long.toString(i)); + Thread.sleep(500); + } + } + catch (InterruptedException e) {} + finally + { + log.info("{}: Closing the KafkaProducer", id); + producer.close(); + log.info("{}: Produced {} messages in total, exiting!", id, produced); + done = true; + } + } - final ProducerRecord record = new ProducerRecord<>( - "test", // Topic - Long.toString(i%10), // Key - Long.toString(i) // Value - ); + void send(String key, String value) + { + final long time = System.currentTimeMillis(); - producer.send(record, (metadata, e) -> - { - long now = System.currentTimeMillis(); - if (e == null) - { - // HANDLE SUCCESS - 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", + 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, - i, record.key(), + record.value(), + metadata.partition(), + metadata.offset(), + metadata.timestamp(), now - time ); } - } - finally + 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 static void main(String[] args) throws Exception + { + String broker = ":9092"; + String topic = "test"; + String clientId = "DEV"; + + switch (args.length) { - log.info("{}: Closing the KafkaProducer", id); - producer.close(); - log.info("{}: Exiting!", id); + case 3: + clientId = args[2]; + case 2: + topic = args[1]; + case 1: + broker = args[0]; } + + SimpleProducer producer = new SimpleProducer(broker, topic, clientId); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> + { + producer.running = false; + while (!producer.done) + { + log.info("Waiting for producer..."); + try + { + Thread.sleep(1000); + } + catch (InterruptedException e) {} + } + log.info("Shutdown completed."); + })); + + log.info( + "Running simple producer: broker={}, topic={}, client-id={}", + broker, + topic, + clientId); + producer.run(); } }