windows下启动kafka
空白处点击 shift右键打开命令窗口
之前斜杠方向错了 一直启动不了
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
bin\windows\kafka-server-start.bat config\server.properties
linux下启动kafka
nohup bin/zookeeper-server-start.sh config/zookeeper.properties > nohup.out 2>&1 &
nohup bin/kafka-server-start.sh config/server.properties > nohupkafka.out 2>&1 &
查看kafka队列信息
bash bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --describe --group test-consumer-group
生产者发送消息
public static void send(KafkaMessage message) {
String jsonData = JSONObject.toJSONString(message);
@SuppressWarnings("unchecked")
KafkaTemplate<String, String> kafkaTemplate = SpringUtil.getBean(KafkaTemplate.class);
ListenableFuture<SendResult<String, String>> listenableFuture = kafkaTemplate.send(KafkaConst.KAFKA_TOPIC,
jsonData);
sendCallBack(listenableFuture);
}
消费者消费消息
@KafkaListener(topics = {KafkaConst.KAFKA_TOPIC_4,KafkaConst.KAFKA_TOPIC_1,KafkaConst.KAFKA_TOPIC_2,KafkaConst.KAFKA_TOPIC_3})
public void listen(ConsumerRecord<?, ?> record) {
System.err.println("kafka接收成功");
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object data = kafkaMessage.get();
if (data != null && StringUtils.isNotBlank(String.valueOf(data))) {
try {
String dataString = String.valueOf(data);
KafkaMessage message = JSONObject.parseObject(dataString, KafkaMessage.class);
KafkaMessageHeaderEnum kafkaMessageHeaderEnum = message.getMessageHeaderEnum();
if (kafkaMessageHeaderEnum != null) {
// 每个case里面最好不要写逻辑,直接写实现类
switch (kafkaMessageHeaderEnum) {
case ALERT:
Object messageData = message.getData();
if (messageData != null) {
AlertKafkaSend alertKafkaSend = JSONObject.parseObject(String.valueOf(messageData),
AlertKafkaSend.class);
System.err.println(alertKafkaSend);
alertKafkaConsumerService.send(alertKafkaSend);
}
break;
default:
break;
}
}
} catch (Exception e) {
log.error("kafka报错!", e);
}
}
}
}
注解@KafkaListener
监听符合规则的topic 如@KafkaListener(topics = {KafkaConst.KAFKA_TOPIC_4,KafkaConst.KAFKA_TOPIC_1,KafkaConst.KAFKA_TOPIC_2,KafkaConst.KAFKA_TOPIC_3}) 一有符合规则的topic产生,就会执行被注解的方法
回调获得反馈lambda
成功就执行success 失败就执行failure
private static void sendCallBack(ListenableFuture<SendResult<String, String>> listenableFuture) {
try {
SendResult<String, String> sendResult = listenableFuture.get();
listenableFuture.addCallback(SuccessCallback -> {
log.info("kafka Producer发送消息成功!topic=" + sendResult.getRecordMetadata().topic() + ",partition"
+ sendResult.getRecordMetadata().partition() + ",offset="
+ sendResult.getRecordMetadata().offset());
}, FailureCallback -> log.error(
"kafka Producer发送消息失败!sendResult=" + JSONObject.toJSONString(sendResult.getProducerRecord())));
} catch (Exception e) {
log.error("获取producer返回值失败", e);
}
}
非lambda
ListenableFuture<SendResult<String, String>> listenableFuture = kafkaTemplate.send("topic", "partition","key","data");
//发送成功回调
SuccessCallback<SendResult<String, String>> successCallback = new SuccessCallback<SendResult<String, String>>() {
@Override
public void onSuccess(SendResult<String, String> result) {
//成功业务逻辑
}
}
//发送失败回调
FailureCallback failureCallback = new FailureCallback() {
@Override
public void onFailure(Throwable ex) {
//失败业务逻辑
}
}
listenableFuture.addCallback(successCallback, failureCallback);