一.必须按配置
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());
980

被折叠的 条评论
为什么被折叠?



