一. 引入依赖:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
二. 新增配置:
# Kafka config
spring.kafka.producer.bootstrap-servers=192.168.2.201:9092
spring.kafka.consumer.bootstrap-servers=192.168.2.201:9092
# 事务支持
# spring-kafka提供了spring.kafka.producer.transaction-id-prefix属性开启事务
# 仅需要配置事务前缀,并且在所有涉及到kafka操作及监听的方法上增加@Transcational注解。
spring.kafka.producer.transaction-id-prefix=kafka_tx.
#自定义topic
customer.kafka.topic=yfy1
三. 具体代码实现
package com.kafka.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BaseController {
private static final Logger logger = LoggerFactory.getLogger(BaseController.class);
@Autowired
private KafkaTemplate template;
@Value("${customer.kafka.topic}")
private String topic;
/**
* 手动开启事务
* @param input
* @return
*/
@GetMapping("/send/{input}")
public String sendToKafka(@PathVariable String input) {
// 事务操作
template.executeInTransaction(t -> {
t.send(topic, input);
if ("error".equals(input)) {
throw new RuntimeException("input is error");
}
t.send(topic, input + " anthor");
return true;
});
return "send success";
}
/**
* 注解声明式事务
*/
@GetMapping("/sendt/{input}")
@Transactional(rollbackFor = RuntimeException.class)
public String sendToKafka2(@PathVariable String input) {
template.send(topic, input);
if ("error".equals(input)) {
throw new RuntimeException("input is error");
}
template.send(topic, input + " anthor");
return "send success";
}
/**
* 接收消息
*/
@KafkaListener(id = "", topics = "${customer.kafka.topic}", groupId = "group.demo")
public void listener(String input) {
logger.info("input value:{}", input);
}
}