import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.config.SaslConfigs;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
// <groupId>org.apache.kafka</groupId>
// <artifactId>kafka-clients</artifactId>
// <version>2.2.2</version>
public class KafkaProducer {
public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
Properties props = new Properties();
// projectId: Topic 所属的 ProjectID 。 net: 公网访问时填入 public,私网访问时为 private。
String userName = "${projectId}#${net}";
// 火山引擎账号的密钥,或具备对应权限的 IAM 账号密钥。不支持STS临时安全令牌。
String passWord = "${AK}#${SK}";
props.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, "${hosts}");
props.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
props.put(SaslConfigs.SASL_JAAS_CONFIG,
"org.apache.kafka.common.security.plain.PlainLoginModule " +
"required username=\"" + userName + "\" password=\"" + passWord + "\";");
props.put(ProducerConfig.ACKS_CONFIG, "1"); // NoResponse 0;WaitForLocal 1;WaitForAll -1
props.put(CommonClientConfigs.RETRIES_CONFIG, 5);
props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4"); // 配置压缩方式。
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
props.put(ProducerConfig.LINGER_MS_CONFIG, "100");
props.put(ProducerConfig.BATCH_SIZE_CONFIG, "262144");
props.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, "1046576");
Producer<String, String> producer = new org.apache.kafka.clients.producer.KafkaProducer<String, String>(props);
Future<RecordMetadata> meta = producer.send(new ProducerRecord<String, String>("${topicId}", "testMessageValue"));
RecordMetadata recordMetadata = meta.get(100, TimeUnit.SECONDS);
System.out.println("partition=" + recordMetadata.partition() + "offset = " + recordMetadata.offset());
System.out.println("Kafka Producer 是异步发送数据,建议等待 10s 后再关闭进程,以确保所有的数据都成功发送,否则会导致上传的数据不完整。");
// 在生产环境中,producer 应该常驻在进程中。只有在进程退出时,才调用 close 方法关闭 producer。