基于redisson实现发布订阅(多服务间用避坑)

这篇具有很好参考价值的文章主要介绍了基于redisson实现发布订阅(多服务间用避坑)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

       今天要分享的是基于Redisson实现信息发布与订阅(以前分享过直接基于redis的实现),如果你是在多服务间基于redisson做信息传递,并且有服务压根就收不到信息,那你一定要看完。
       今天其实重点是避坑,真正的集成使用就几步。


一、redission介绍

       介绍的文字我都懒得写,其实要我写详细,我也是google,下面直接贴图吧
基于redisson实现发布订阅(多服务间用避坑),高效开发分享,业务设计思路,第三方对接,redisson信息发布订阅,redisson信息消费不到,redisson信息监听不到,信息多服务间监听不到
       介绍的挺详细的吧,下面还有代码示例哦,不得不说这个GPT插件挺好用的。
       其实简单理解就一句话:它就是redis的java客户端,做了一层封装。

二、使用步骤

1.引入库

代码如下(示例):

        <!-- springboot redis集成 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

        <!-- springBoot redisson redis支持 -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.24.3</version>
        </dependency>

2.信息发布


/**
 * 告警监听器
 */

import cn.hutool.json.JSONUtil;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.codec.SerializationCodec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.xx.xx.alarm.entity.Alarm;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;


@Component
public class AlarmListener{
  
    private static final Logger LOGGER = LoggerFactory.getLogger(AlarmListener.class);

    @Resource
    private RedissonClient redisson;
    public static String WS_ALARM_LISTEN = "WS_ALARM_LISTEN";
    private RTopic topic;



    /**
     * 开启监听
     */
    @PostConstruct
    void openReceiving() {
        topic = redisson.getTopic(WS_ALARM_LISTEN, new SerializationCodec());
    }

	/**
	* 业务需要的地方可以直接待用
	**/
    public void sendNotice(Alarm alarm) {
		//redis 发广播
        try {
            //topic.publish(alarm);
            //屏蔽redisssion监听对class的差异
            String alarmStr = JSONUtil.toJsonStr(alarm);
            topic.publish(alarmStr);
        } catch (Exception e) {
            LOGGER.error("sendNotice失败:", e);
        }
    }

}

       Alarm是告警实体对象,大家根据自己的业务,可能是其他对象。


3、信息订阅


/**
 * 告警监听器
 *
 */

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xxxx.entity.Alarm;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.redisson.codec.SerializationCodec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;

@Component
public class AlarmListener {
   

    private static final Logger LOGGER = LoggerFactory.getLogger(AlarmListener.class);
    
    @Resource
    private RedissonClient redisson;
    public static String WS_ALARM_LISTEN = "WS_ALARM_LISTEN";
    private RTopic topic;




    /**
     * 开启监听
     */
    @PostConstruct
    void openReceiving() {
        topic = redisson.getTopic(WS_ALARM_LISTEN, new SerializationCodec());
        LOGGER.info("监听ws成功:{}", topic);
        
        topic.addListener(String.class, (charSequence, msgStr) -> {
        //TODO 收到消息,去做自己的业务,下面是我们业务的一个示例
            if (StringUtils.isNotEmpty(msgStr) && JSONUtil.isJson(msgStr)) {
                Alarm alarm = JSON.parseObject(msgStr, Alarm.class);
                send(alarm);
            }
        });
    }    
}

       其实就这么简单,如果是在一个服务里面用,2个监听器是可以合并的。我这里是2个服务里面用。
       就是因为在2个服务里面用,不知道大家有没有发现topic的publish、addListener的特别之处?可能大家在写的时候,可以直接publish、addListener放入业务对象.class参数。我刚开始也是被坑在这里。一个服务里面publish信息了,另一个服务里死活收不到,用redis-cli去看,发现信息又是放入了主题的,监听的主题也与发布的一致。
       补充redis-cli命令的使用:

redis-cli -h redis服务ip -p 端口 -a 密码

SUBSCRIBE topic名称

       我首先想到的是2边版本不一致,于是把新搭建的流水服务的redisson-spring-boot-starter降版本,结果还是一样。
       然后,就debug,发现监听里的onMessage基类会做如下判断:
基于redisson实现发布订阅(多服务间用避坑),高效开发分享,业务设计思路,第三方对接,redisson信息发布订阅,redisson信息消费不到,redisson信息监听不到,信息多服务间监听不到
       这个除了判断channel频道,收到的信息,还会判断信息与添加监听addListener时传入的class是否可以转换。

基于redisson实现发布订阅(多服务间用避坑),高效开发分享,业务设计思路,第三方对接,redisson信息发布订阅,redisson信息消费不到,redisson信息监听不到,信息多服务间监听不到
       网上好多都只提到publish、addListener,但是压根记不会提到传入的class会干嘛,知道问题原因后,我们让数据回归本质,直接用String,这也就形成了我上面的2段。文章来源地址https://www.toymoban.com/news/detail-756561.html

总结

  • 基于redisson实现信息发布订阅就是这么简单几下
  • 一定注意publish、addListener不要直接用业务对象(尤其是不在一个服务里,毕竟谁也不能保证对象名一样,也不能保证包路径一样),回归信息的本质用字符串靠谱
  • 如果是复杂的信息传递机制,还是用专业的信息中间件
    好了,就写到这里,希望可以帮到大家。

到了这里,关于基于redisson实现发布订阅(多服务间用避坑)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Redisson】Redisson--话题(订阅分发)

    Redisson系列文章: 【Redisson】Redisson–基础入门 【Redisson】Redisson–布隆(Bloom Filter)过滤器 【Redisson】Redisson–分布式锁的使用(推荐使用) 【分布式锁】Redisson分布式锁底层原理 【Redisson】Redisson–限流器、 【Redisson】Redisson–分布式远程服务(Remote Service) 没想到Redisson居然还

    2024年02月12日
    浏览(35)
  • 关于GeoServer发布服务时数据源设置的避坑指南

            时光任然,一年一度的五一劳动节已然来到。作为疫情之后迎来的第一个五一,不知道各位小伙伴们怎么度过这个劳动节呢?是决定去另一个城市,观察体验一下不一样的风景,或者去旅游,给自己放假。昨天被12306的一则关于上海虹桥站4月28日火车票全部售罄的

    2024年02月01日
    浏览(42)
  • 使用spring自带的发布订阅来实现发布订阅

    公司的项目以前代码里面有存在使用spring自带发布订阅的代码,因此稍微学习一下如何使用,并了解一下这种实现方式的优缺点。 优点 实现方便,代码方面基本只需要定义消息体和消费者,适用于小型应用程序。 不依赖外部中间件,因而不需要复杂的配置、部署。 缺点 无

    2024年02月10日
    浏览(35)
  • 客服端向服务端发布、订阅、取消

    MQTT客户端一旦连接到服务端,便可以发布消息。 每条发布的MQTT消息必须包含一个主题。MQTT服务器可以通过主题确定将消息转发给哪些客户端。 MQTT客户端发布消息时,会向服务端发送PUBLISH报文。以下是PUBLISH报文的详细信息。 topicName – 主题名 主题名用于识别此信息应发布

    2024年02月07日
    浏览(44)
  • 【初始RabbitMQ】发布订阅的实现

    生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式, 所有在该信道上面发布的消息都将会被指派一个唯一的 ID (从 1 开始),一旦消息被投递到所有匹配的队列之后,broker 就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队

    2024年02月22日
    浏览(35)
  • JAVA 实现 Redis 发布订阅

    发布订阅: 消息发布者发布消息 和 消息订阅者接收消息 ,两者之间通过某种媒介联系起来 例如订杂志,当自己订阅了爱格杂志,每个月会发刊一本。到发布的时候派送员将杂志送到自己手上就能看到杂志内容。只有我们订阅了该杂志才会派送给我们 Redis 发布订阅(pub/su

    2024年02月14日
    浏览(36)
  • Redis实现消息的发布和订阅

    4.1 发送消息 4.2 接收消息

    2024年02月13日
    浏览(40)
  • ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布

    目录 写在前面 三种方案(利用ESP32连接EMQX下的MQTT) 步骤 ESP32烧录固件并AT指令进行测试。 下载固件  烧录工具下载 烧录固件(选择ESP32)  关于AT 指令与MQTT服务器断开后自动重连MQTT服务器 关于AT指令设置上电自动连接WIFI 关于AT指令设置断开后自动重新连接WIFI STM32对接E

    2023年04月12日
    浏览(43)
  • Vue中信息订阅与发布和配置代理服务器的使用和原理

    全局事件总线和信息订阅与发布一样都是实现任意组件的通信。常用的是全局事件总线 信息订阅与发布借用第三方库pubsub实现任意组件的通信 安装pubsub 下列代码为MyHeader组件订阅了一份信息,MyFooter负责传递信息给MyHeader 触发点击事件发布信息给MyHeader 假设目前有两个端口的

    2024年02月03日
    浏览(40)
  • 【Python】Flask + MQTT 实现消息订阅发布

    本次项目主要使用到的库: flask_mqtt 1.创建Flask项目 2创建py文件: mqtt_demo.py 3.代码实现 4.项目运行 运行项目前可在Pycharm中设置 host 和 port 设置好后直接运行项目 使用 MQTTX 进行消息测试 1、测试消息接收 创建连接 Host :为代码中定义好的 broker.emqx.io Port :为代码中定义好的

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包