1、实时获取topic内容
问题描述:如何实现当生产者往topic中写入一条消息时,消费者能够实时读取到这条消息
解决方法:使用 @KafkaListener 注解
代码示例:
//kafka topic name
private final String topicNameReceive = "your_topic_name";
@KafkaListener(
topics = {topicNameReceive},
groupId = "your_kafka_group"
)
public void kafkaReceiveListener(ConsumerRecord<?, ?> record){
log.info("监听到原始数据: " + record.value());
String dtoStr = (String) record.value();
log.info("数据转换前: " + dtoStr);
RemoteSwitchEnqueue paramDto = JSONUtil.toBean(dtoStr, RemoteSwitchEnqueue.class);
log.info("数据转换为Java对象: " + paramDto.toString());
//异步调用操作方法
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(10000);
consumeOrderProcess(paramDto);
} catch (Exception e) {
Thread.currentThread().interrupt(); // 保留中断状态
System.out.println(e.getMessage());
throw new IllegalStateException("consumeOrderProcess方法执行时被中断", e);
}
});
}
注解参数:
-
topics: 数组类型,表示要监听的Kafka主题。
-
groupId: 字符串类型,表示监听器所属的消费者组。
-
containerFactory: 用于创建Kafka监听容器的工厂类。
-
errorHandler: 用于处理监听器内部错误的处理器。
-
autoStartup: 布尔类型,表示是否在启动时自动启动监听器
2、往kafka中写消息
引入 KafkaTemplate 类
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
调用类中的send方法:
String jsonStr = JSONUtil.toJsonStr(rsd);
kafkaTemplate.send(your_topicName,jsonStr);