记SpringBoot全量消费Kafka数据处理后发送到Kafka

472 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

背景

  1. 业务需求每次请求都拉取kafka指定topic下的全量数据
  2. 数据解析发送kafka指定的topic

消费数据

参数配置

/* 1.创建消费者配置信息 */
Properties props = new Properties();
/*2.给配置信息赋值*/
/*2.1连接的集群*/
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
/*2.2开启自动提交 */
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
/*2.3 自动提交的延时*/
//由于每次都是全量拉取,从头消费,所以关闭了自动提交,也不用配置提交延时
//props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
/*2.4 key value的反序列化 */
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
/*2.5 消费者组 */
props.put(ConsumerConfig.GROUP_ID_CONFIG, "xxx"); // group.id
/*2.6 重置消费者的offset */
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); // 默认值是 lastest

创建消费者

/* 创建消费者 */
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(props);
kafkaConsumer.subscribe(Lists.newArrayList("--topic--"));

拉取数据

/* 循环拉取 */
while (true) {
/* 消费消息-获取数据 */
    ConsumerRecords<String, String> consumerRds = kafkaConsumer.poll(Duration.ofSeconds(10));
    //如果拉取数据为空则推出循环
    if (consumerRds.isEmpty()) break;
    /* 解析并打印 ConsumerRecords  */
/* 遍历 ConsumerRecords*/
    for (ConsumerRecord<String, String> rd : consumerRds) {
        if (StringUtils.isNotBlank(rd.value())) {
            System.out.println("[消费者] " + rd.key() + "--" + rd.value());
        }
    }
}

生产数据

生产数据使用KafkaTemplate

参数配置

kafka:
  producer:
    bootstrap-servers: xxx:9092
    acks: 1
    retries: 3
    batch-size: 65536
    compression-type: gzip
    buffer-memory: 67108864
    key-serializer: org.apache.kafka.common.serialization.StringSerializer
    value-serializer: org.apache.kafka.common.serialization.StringSerializer

类自动注入

@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;

pom依赖

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

发送数据

public void send(String topic, Object obj) {
    String obj2String = JSONObject.toJSONString(obj);
    log.info("准备发送消息为:{}", obj2String);
    //发送消息
    ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, obj);
    future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
        @Override
        public void onFailure(Throwable throwable) {
            //发送失败的处理
            log.info(topic + " - 生产者 发送消息失败:" + throwable.getMessage());
        }

        @Override
        public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
            //成功的处理
            log.info(topic + " - 生产者 发送消息成功:" + stringObjectSendResult.toString());
        }
    });
}