SpringBoot整合Kafka(4)
1. Kafka事务配置
1.1 @Transactional注解方式
配置KafkaTransactionManager,配置producerFactory并开启事务功能
//根据senderProps填写的参数创建生产者工厂
@Bean
public ProducerFactory<Integer, String> producerFactory() {
DefaultKafkaProducerFactory defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(senderProps());
defaultKafkaProducerFactory.transactionCapable();
defaultKafkaProducerFactory.setTransactionIdPrefix("tran-");
return defaultKafkaProducerFactory;
}
@Bean
public KafkaTransactionManager transactionManager(ProducerFactory producerFactory) {
KafkaTransactionManager manager = new KafkaTransactionManager(producerFactory);
return manager;
}
@ResponseBody
@RequestMapping(value = "sendMsg")
@Transactional
public void sendMsg() throws InterruptedException, ExecutionException {
kafkaTemplate.setProducerListener(kafkaSendResultHandler);
kafkaTemplate.send("topic.quick.tran", "test transactional annotation");
throw new RuntimeException("fail");
}
1.2 使用executeInTransaction方法
@ResponseBody
@RequestMapping(value = "msg1")
@Transactional
public void msg1() throws InterruptedException, ExecutionException {
kafkaTemplate.executeInTransaction(new KafkaOperations.OperationsCallback() {
@Override
public Object doInOperations(KafkaOperations kafkaOperations) {
kafkaOperations.send("topic.quick.tran", "test executeInTransaction");
throw new RuntimeException("msg1 fail");
}
});
}
2. 消息批量消费
2.1 批处理监听器BatchListener
配置KafkaListener的containerFactory属性
package zhw.example.zhw.kafka;
import org.apache.kafka.clients.admin.NewTopic;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.IntegerDeserializer;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class BatchListener {
private static final Logger log= LoggerFactory.getLogger(BatchListener.class);
private Map<String, Object> consumerProps(