持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
背景
- 业务需求每次请求都拉取kafka指定topic下的全量数据
- 数据解析发送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());
}
});
}