spring kafka使用(二)

传送门:
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();
    }

注意: 在添加transaction-id-prefix后,所有的发送方必须强制添加事务。否则会报错无法启动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vace cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值