一.必须按配置
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.19092");//kafka broker地址
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");//key序列化
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");//value序列化
二.创建生产者
Producer<String, String> producer = new KafkaProducer<>(props); 三.创建ProducerRecord
var producerRecord = new ProducerRecord<>("jc-kafka-1-topic-2", "testkey", "test-value"); 四.异步发送消息
Future<RecordMetadata> send = producer.send(producerRecord);
五.同步发送消息
var recordMetadata = producer.send(producerRecord).get(); 六.打印发送结果
System.out.println("partition " + recordMetadata.partition() + " offset " + recordMetadata.offset());
以上为最基础的发送消息实例,下面针对高级用法做些展示 一.创建ProducerRecord时指定timestamp,Partition,Header
ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value, Iterable<Header> headers) 二.自定义分区方式 1.创建分区器,比如采用随机的方式
public class TestPartitioner implements Partitioner { private static final Random random = new Random(); @Override public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { var count = cluster.partitionCountForTopic(topic); return random.nextInt(count); } @Override public void close() { } @Override public void configure(Map<String, ?> configs) { } } 2.使用分区器,需要修改生产者配置,增加以下
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, TestPartitioner.class.getName()); 三.自定义拦截器,方式和自定义分区器类似 1.创建拦截器,例如给value都加上前缀
public class TestInterceptor implements ProducerInterceptor<String, String> { @Override public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) { return new ProducerRecord<>(record.topic(), "pre" + record.value()); } @Override public void onAcknowledgement(RecordMetadata metadata, Exception exception) { } @Override public void close() { } @Override public void configure(Map<java.lang.String, ?> configs) { } } 2.使用拦截器,需要修改生产者配置,增加以下
props.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TestInterceptor.class.getName());