传送门:
spring kafka使用(一)
本篇文章只介绍发送方
配置默认topic
在KafkaTopicConfig中添加如下代码,则将名字为topic.quick.default的topic设置为默认topic
@Resource
KafkaTemplate template;
/**
* 注入默认topic
*/
@Bean
public void defaultKafkaTemplate() {
template.setDefaultTopic("topic.quick.default");
}
代码如下
发送消息时
@RequestMapping("/userGets")
public Object gets() {
kafkaTemplate.sendDefault("1231235");
return ResultUtil.success();
}
发送消息拦截器
我们使用kafkaTemplate发送消息的时候,是不确定该消息是否被kafka接收的
创建拦截器
package com.kofan.server.kafkaMq.handler;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.support.ProducerListener;
import org.springframework.stereotype.Component;
/**
* @author king
*/
@Component
public class KafkaSendResultHandler implements ProducerListener {
private static final Logger log = LoggerFactory.getLogger(KafkaSendResultHandler.class);
@Override
public void onSuccess(ProducerRecord producerRecord, RecordMetadata recordMetadata) {
log.info("Message send success : " + producerRecord.toString());
}
@Override
public void onError(ProducerRecord producerRecord, Exception exception) {
log.info("Message send error : " + producerRecord.toString());
}
}
在KafkaTopicConfig中添加如下代码
// 引入刚创建的拦截去
@Resource
KafkaSendResultHandler kafkaSendResultHandler;
/**
* 注入消息成功失败拦截器
*/
@Bean
public void producerListen() {
template.setProducerListener(kafkaSendResultHandler);
}
这样,无论消息发送成功还是失败都会进入拦截器中
事务处理
新版本已经不需要注册事务处理,在配置文件上新增 transaction-id-prefix配置项即可
在配置文件的发送方添加:
transaction-id-prefix: rollback_ # 事务前缀(值可以随便写,看你意愿)
发送信息:
方法一:
@RequestMapping("/userGets")
@Transactional(rollbackFor = RuntimeException.class)
public Object gets() {
kafkaTemplate.sendDefault("1231235");
int i = 1 / 0;
return ResultUtil.success();
}
方法二:
@RequestMapping("/userGets")
public Object gets() {
kafkaTemplate.executeInTransaction(operations -> {
operations.sendDefault("12355","123123"+new Date());
int i = 1 / 0;
return true;
});
return ResultUtil.success();
}