记一次项目所学(中间件等)-动态提醒功能(RocketMQ)

news2024/10/5 14:32:55

记一次项目所学(中间件等)–动态提醒功能(RocketMQ)

订阅发布模式与观察者模式

在这里插入图片描述

在这里插入图片描述

RocketMQ:纯java编写的开源消息中间件 高性能低延迟分布式事务

Redis : 高性能缓存工具,数据存储在内存中,读写速度非常快

RocketMQ相关工具类及配置实现

配置类

 
<dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.9.1</version>
        </dependency>
	//redis
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

生产者发送消息工具类

public class RocketMQUtil {

    //同步发送消息
    public static void syncSendMsg(DefaultMQProducer producer, Message msg) throws Exception{
        SendResult result = producer.send(msg);
        System.out.println(result);
    }
    //异步发送消息
    public static void asyncSendMsg(DefaultMQProducer producer, Message msg) throws Exception{
        producer.send(msg, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                Logger logger = LoggerFactory.getLogger(RocketMQUtil.class);
                logger.info("异步发送消息成功,消息id:" + sendResult.getMsgId());
            }
            @Override
            public void onException(Throwable e) {
                e.printStackTrace();
            }
        });
    }
}

RocketMQ配置类

@Configuration
public class RocketMQConfig {
    //  rocketMQ名称服务器的地址
    @Value("${rocketmq.name.server.address}")
    private String nameServerAddr;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private UserFollowingService userFollowingService;

    //生产者
    @Bean("momentsProducer")
    public DefaultMQProducer momentsProducer() throws Exception{
        DefaultMQProducer producer = new DefaultMQProducer(UserMomentsConstant.GROUP_MOMENTS);
        producer.setNamesrvAddr(nameServerAddr);
        producer.start();
        return producer;
    }

    @Bean("momentsConsumer")
    //push 为推送,还有拉取等consumer
    public DefaultMQPushConsumer momentsConsumer() throws Exception{
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(UserMomentsConstant.GROUP_MOMENTS);
        consumer.setNamesrvAddr(nameServerAddr);
        //订阅    *表示所有内容
        consumer.subscribe(UserMomentsConstant.TOPIC_MOMENTS, "*");
        //消费者监听器,监听到后下一步操作
        //registerMessageListener注册消息监听
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            //ConsumeConcurrentlyStatus并发处理
            //MessageExt消息的扩充,ConsumeConcurrentlyContext为处理的上下文
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){
                MessageExt msg = msgs.get(0);
                if(msg == null){
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
                //取出的是byte数组类型
                String bodyStr = new String(msg.getBody());

                UserMoment userMoment = JSONObject.toJavaObject(JSONObject.parseObject(bodyStr), UserMoment.class);
                Long userId = userMoment.getUserId();
                //定位粉丝id
                List<UserFollowing>fanList = userFollowingService.getUserFans(userId);
                for(UserFollowing fan : fanList){
                    //发到redis用户到redis拿
                    String key = "subscribed-" + fan.getUserId();
                    //把动态列表拿出来
                    String subscribedListStr = redisTemplate.opsForValue().get(key);
                    List<UserMoment> subscribedList;
                    if(StringUtil.isNullOrEmpty(subscribedListStr)){
                        subscribedList = new ArrayList<>();
                    }else{
                        //转换列表的类
                        subscribedList = JSONArray.parseArray(subscribedListStr, UserMoment.class);
                    }
                    subscribedList.add(userMoment);
                    //把列表再转成字符串放进去
                    redisTemplate.opsForValue().set(key, JSONObject.toJSONString(subscribedList));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        return consumer;
    }

具体业务逻辑:

@Service
public class UserMomentsService {

    @Autowired
    private UserMomentsDao userMomentsDao;

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void addUserMoments(UserMoment userMoment) throws Exception {
        userMoment.setCreateTime(new Date());
        //crud
        userMomentsDao.addUserMoments(userMoment);
        DefaultMQProducer producer = (DefaultMQProducer)applicationContext.getBean("momentsProducer");
        //主题 以及json的数组消息
        Message msg = new Message(UserMomentsConstant.TOPIC_MOMENTS, JSONObject.toJSONString(userMoment).getBytes(StandardCharsets.UTF_8));
        RocketMQUtil.syncSendMsg(producer, msg);
    }
    // 查询订阅动态
    public List<UserMoment> getUserSubscribedMoments(Long userId) {
        String key = "subscribed-" + userId;
        //查出来的是String描述的json类型
        String listStr = redisTemplate.opsForValue().get(key);
        //返回的是List类型,要把查出来的String封装成一个一个的UserMoment再进List中
        return JSONArray.parseArray(listStr, UserMoment.class);
    }
}

PS:消费信息逻辑在配置类的Consumer中已经写好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VBA_NZ系列工具NZ03:利用右键进行筛选操作

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

2024西安天文科技与探索装备展览会-相聚7月

2024西安天文科技与探索装备展览会-相聚7月 时间&#xff1a;2024年7月14-16日 地点&#xff1a;西安国际会展中心 首个面向全球天文产业的展览&#xff1b;中国唯一全面反映天文产业链的盛会&#xff1b; 定位于国际高端产业的展会&#xff1b;众多天文机构鼎力支持和重点培…

HTTPS网络请求失败WiFi请求成功

在xml的config文件中添加raw文件位置 raw文件是证书的pem文件去掉key文件 文件名称去掉多余的.cn

炫云客户端12载风华,最初界面竟长这样?满满都是回忆!

2013年&#xff0c;注定是一个意义非凡的节点 让我们将时间轴拨回到2013年 这一年&#xff0c;到底发生了什么呢&#xff1f; 这一年&#xff0c;嫦娥三号成功落月 中国探月工程开启新征程 这一年&#xff0c;工信部向三大运营商颁发4G牌照 标志着我国正式迈入4G时代 同…

51单片机基础篇系列-超声波测距

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HC-SR04产品特点 典型工作用电压&#xff1a;5V 超小静态工作电流&#xff1a;小于2mA 感应角度&#xff1a;不大于15度 探测距离&#xff1a;2cm-400cm 高精度&#…

Spring AOP常见面试题

目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API&#xff0c;通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…

【C++】STL(四) deque容器

4、deque容器 4.1 简介 ① 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作&#xff0c;也可以对尾端进行插入和删除操作。 ② deque与vector区别&#xff1a; vector对于头部的插入效率低&#xff0c;数据量越大&#xff0c;效率越低&#xff0c;例如头部…

掘根宝典之C++迭代器简介

在C中&#xff0c;容器是一种用于存储和管理数据的数据结构。C标准库提供了多种容器&#xff0c;每种容器都有其独特的特点和适用场景。 我们知道啊&#xff0c;我们可以通过下标运算符来对容器内的元素进行访问&#xff0c;但是只有少数几种容器才同时支持下标运算符&#xf…

#车载诊断协议DoIP系列 —— 套接字处理 在线检查

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四海皆为家。人生的面吃一…

Java中 final、finally、finalize 有什么区别?

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字&#xff0c;它们除了长得像之外&#xff0c;其他的&#xff08;作用和含义&#xff09;完全不同。 它们三个的区别就好像&#xff1a;雷、雷锋、雷峰塔之间的区别。&#xff08;是三个完全不同的东西&#…

【动态规划】C++算法312 戳气球

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode312 戳气球 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums…

基于springboot+vue实现教学改革项目管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现教学改革项目管理系统演示 摘要 教学改革行业的不断发展才能让更多的学生受益&#xff0c;那么教学改革的老师们对于教改可谓是花费了很大的心血。这种心血不仅仅在教学方式方法上&#xff0c;而且还是在于线下的流程审批和审核及教学改革的项目资料整理…

便携式隧道能见度仪的使用

TH-BN6随着交通基础设施的不断发展&#xff0c;隧道作为连接城市、山区等关键地段的交通要道&#xff0c;发挥着越来越重要的作用。然而&#xff0c;隧道内的能见度问题一直是困扰隧道运营者的难题。为了保障隧道通行安全&#xff0c;便携式隧道能见度仪应运而生。 二、便携式隧…

解忧杂货铺(①):必备网站资源

目录 在线工具 简单教程 程序员导航网 中国大学 青柠 廖雪峰的官方网站 在线工具 各类工具 https://tool.lu/ 简单教程 简单教程 https://www.twle.cn/ 程序员导航网 程序员导航网 https://hao.panziye.com/ 中国大学 中国大学MOOC网 https://www.icourse163.org/ 青…

Python 对Excel工作表中的数据进行排序

在Excel中&#xff0c;排序是整理数据的一种重要方式&#xff0c;它可以让你更好地理解数据&#xff0c;并为进一步的分析和报告做好准备。本文将介绍如何使用第三方库Spire.XLS for Python通过Python来对Excel中的数据进行排序。包含以下三种排序方法示例&#xff1a; 按数值…

数字脉搏:互联网的演进与社会脉络

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

深入理解快速排序

一、快速排序 快速排序是冒泡排序的一种改进算法&#xff0c;相比于冒泡排序效率更优。 算法过程分析&#xff1a; 通过采用分治策略&#xff0c;围绕一个 x 将原始数组划分为两个子数组&#xff0c;使得前一个子数组的元素≤ x ≤ 后一个子数组元素&#xff0c;对两个子数组进…

诗词生成之setting

先上代码&#xff1a; # 禁用词&#xff0c;包含如下字符的唐诗将被忽略 DISALLOWED_WORDS [&#xff08;, &#xff09;, (, ), __, 《, 》, 【, 】, [, ]] # 句子最大长度 MAX_LEN 64 # 最小词频 MIN_WORD_FREQUENCY 8 # 训练的batch size BATCH_SIZE 16 # 数据集路径 DA…

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件&#xff0c;这种问题到底要怎么去解决呢&#xff1f;其实这种现象是正常的&#xff0c;为啥说正常呢&#xff0c;下面我们会给大家详细的讲解dll为啥会缺少&#xff0c;然后还会讲解电脑缺少dll文件怎么解决的方法&#xff0c;好了&#xff…