根据kafka版本引入具体对应的依赖版本
我这里的kafka版本为2.7.1;安装kafka集群请参照 juejin.cn/post/698619…
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.13</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.7.1</version>
</dependency>
编写一个properties工具,用于读取kafka配置信息
public class PropUtils {
/**
* read properties in classpath
*
* @param filename file name
* @return properties
* @throws IOException e
*/
public static Properties load(String filename) throws IOException {
InputStream inputStream = PropUtils.class.getClassLoader().getResourceAsStream(filename);
Properties prop = new Properties();
prop.load(inputStream);
return prop;
}
}
创建Producer
- 配置kafka-producer配置文件
resource
资源目录下新建kafka-producer.properties
配置文件
bootstrap.servers=localhost:9090,localhost:9091,localhost:9092
key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=org.apache.kafka.common.serialization.StringSerializer
- 配置
Producer
对象
@Configuration
public class KafkaBeanConfiguration {
@Bean
public KafkaProducer<String, Object> kafkaProducer() throws IOException {
return new KafkaProducer<>(PropUtils.load("kafka-producer.properties"));
}
}
- 发送消息用例
向
foo topic
发送bar
消息
@Resource
private KafkaProducer<String, Object> kafkaProducer;
@Test
public void testProducer() {
kafkaProducer.send(new ProducerRecord<>("foo", "bar"));
}
创建Consumer
- 配置kafka-consumer配置文件
resource
资源目录下新建kafka-consumer.properties
配置文件
bootstrap.servers=localhost:9090,localhost:9091,localhost:9092
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
group.id=test-group
- 配置kafkaConsumer对象
@Bean
public KafkaConsumer<String, Object> kafkaConsumer() throws IOException {
return new KafkaConsumer<>(PropUtils.load("kafka-consumer.properties"));
}
- 监听消息,处理消息
@Slf4j
@Component
public class KafkaMessageDispatcher {
@Resource
private KafkaConsumer<String, Object> kafkaConsumer;
@PostConstruct
public void dispatcher() {
kafkaConsumer.subscribe(Collections.singleton("foo"));
try {
new Thread(() -> {
while (true) {
ConsumerRecords<String, Object> records = kafkaConsumer.poll(Duration.ofMillis(100));
handlerRecord(records);
}
}).start();
} catch (Exception e) {
errHandler(e);
}
}
private void handlerRecord(ConsumerRecords<String, Object> records) {
records.forEach(r -> {
log.info("handler record:topic[{}],offset[{}],partition[{}],key[{}],val[{}]",
r.topic(), r.offset(), r.partition(), r.key(), r.value());
});
}
private void errHandler(Exception e) {
// todo
log.info(e.getMessage());
}
}