栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring kafka使用(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring kafka使用(二)

传送门:
spring kafka使用(一)

本篇文章只介绍发送方 配置默认topic


在KafkaTopicConfig中添加如下代码,则将名字为topic.quick.default的topic设置为默认topic

    @Resource
    KafkaTemplate template;
    
    @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;

@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后,所有的发送方必须强制添加事务。否则会报错无法启动
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027925.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号