kafka入门学习(五)-- Kafka事务支持

一、采用spring 注解方式实现kafka 事务

1、在前一篇中的配置类中添加配置

/**
 * 下列三个方法用于 管理
 * 配置KafkaTransactionManager,这个类就是Kafka提供给我们的事务管理类,我们需要使用生产者工厂来创建这个事务管理类。
 * 需要注意的是,我们需要在producerFactory中开启事务功能,并设置TransactionIdPrefix,
 * TransactionIdPrefix是用来生成Transactional.id的前缀。
 * @return
 */
@Bean
public ProducerFactory producerFactory() {
    @SuppressWarnings("rawtypes")
	DefaultKafkaProducerFactory factory = new DefaultKafkaProducerFactory<>(senderProps());
    factory.transactionCapable();
    factory.setTransactionIdPrefix("trans");
    return factory;
}

@Bean
public KafkaTransactionManager transactionManager(ProducerFactory producerFactory) {
    KafkaTransactionManager manager = new KafkaTransactionManager(producerFactory);
    return manager;
}

/**
 * 配置Kafka producer 属性
 * @return
 */
@Bean
public Map senderProps() {
	Map props = new HashMap<>();
     //配置Kafka实例的连接地址
    props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "10.135.128.39:9092,10.135.128.39:9093");
	props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
	props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

	return props;
}

/**
 * KafkaTemplate  也需要重新配置
 * @param factory
 * @return
 */
@Bean
public KafkaTemplate kafkaTemplate(ProducerFactory factory) {
	return new KafkaTemplate(factory);
}

2、在kafkaSender.java 中新增方法

    /**
     * kafka  注解方式实现事务
     */
    @Transactional
    public void TransactionSend(){
    	kafkaTemplate.send("mytopic", "test transactional annotation");
        throw new RuntimeException("fail");
    }

3、SpringBoot 启动类测试

ConfigurableApplicationContext context = SpringApplication.run(SpringBootForKafkaApplication.class, args);
		KafkaSender sender = context.getBean(KafkaSender.class);
		
		sender.TransactionSend();

4、测试结果
控制台报了抛出异常的信息:
kafka入门学习(五)-- Kafka事务支持_第1张图片
查看工具消息是否发生成功:
kafka入门学习(五)-- Kafka事务支持_第2张图片
可以看到当前时间发生的消息 并没有 。

二、使用KafkaTemplate.executeInTransaction开启事务

1、在kafkaSender.java 中新增方法

    /**
     * 使用KafkaTemplate.executeInTransaction开启事务
     */
    public void transactionSend2(){
    	 kafkaTemplate.executeInTransaction(new KafkaOperations.OperationsCallback() {
             @Override
             public Object doInOperations(KafkaOperations kafkaOperations) {
                 kafkaOperations.send("mytopic", "test executeInTransaction");
                 throw new RuntimeException("fail");
                 //return true;
             }
         });
    }

2、启动类测试

ConfigurableApplicationContext context = SpringApplication.run(SpringBootForKafkaApplication.class, args);
		KafkaSender sender = context.getBean(KafkaSender.class);
		
		sender.transactionSend2();

3、测试结果
控制台报了异常:
kafka入门学习(五)-- Kafka事务支持_第3张图片
工具消息仍然没有。kafka入门学习(五)-- Kafka事务支持_第4张图片

三、还有一种producer 的事务,这里就不具体描述了。

你可能感兴趣的:(java)