Spring整合kafka

1,252 阅读1分钟

根据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

  1. 配置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
  1. 配置Producer对象
@Configuration
public class KafkaBeanConfiguration {

    @Bean
    public KafkaProducer<String, Object> kafkaProducer() throws IOException {
        return new KafkaProducer<>(PropUtils.load("kafka-producer.properties"));
    }
}
  1. 发送消息用例 向foo topic发送bar消息
@Resource
private KafkaProducer<String, Object> kafkaProducer;

@Test
public void testProducer() {
    kafkaProducer.send(new ProducerRecord<>("foo", "bar"));
}

创建Consumer

  1. 配置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
  1. 配置kafkaConsumer对象
@Bean
public KafkaConsumer<String, Object> kafkaConsumer() throws IOException {
    return new KafkaConsumer<>(PropUtils.load("kafka-consumer.properties"));
}
  1. 监听消息,处理消息
@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());
    }

}